내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
고루틴은 동일한 주소 공간에서 실행되므로 공유 메모리에 대한 액세스는 동기화되어야 합니다.고루틴은 메모리를 공유하는 것이 아니라 통신을 통해 메모리를 공유합니다.
참조 유형 채널은 CSP 모드의 특정 구현이며 다중 고루틴 통신에 사용됩니다. 동시성 안전성을 보장하기 위해 내부적으로 동기화를 구현합니다.
맵과 마찬가지로 채널도 make에 의해 생성된 기본 데이터 구조에 대한 참조입니다.
채널을 복사하거나 함수 매개변수 전달에 사용할 때는 채널 참조만 복사하므로 호출자와 호출 수신자는 동일한 채널 개체를 참조하게 됩니다. 다른 참조 유형과 마찬가지로 채널의 0 값은 nil입니다.
채널을 정의할 때 채널로 전송되는 값의 유형도 정의해야 합니다. 내장된 make() 함수를 사용하여 채널을 생성할 수 있습니다.
make (chan Type)
make (chan Type,capacity)
channel<-value //发送value 到channel
<-channel //接收并将其丢弃
x:=<-channel //从 channel 中接收数据,并賦偵给x
x,ok:=<-channel //功能同上,同时检查通道是否已关闭或者是否为空
기본적으로 채널은 데이터를 수신하고 보낼 때 다른 쪽 끝이 준비되지 않은 한 차단되므로 명시적인 잠금 없이도 고루틴 동기화가 더 간단해집니다.
버퍼링되지 않은 채널은 값을 수신하기 전에 저장할 수 있는 기능이 없는 채널입니다.
이러한 유형의 채널에서는 전송 고루틴과 수신 고루틴이 동시에 전송 및 수신 작업을 완료할 준비가 되어 있어야 합니다. 두 개의 고루틴이 동시에 준비되지 않은 경우 채널은 보내기 또는 받기 작업을 먼저 수행하는 고루틴을 차단하고 기다리게 합니다.
채널에 대한 전송 및 수신의 상호 작용은 본질적으로 동기식입니다. 어떤 작업도 다른 작업과 독립적으로 존재할 수 없습니다.
다음 그림은 버퍼링되지 않은 채널을 사용하여 두 개의 고루틴이 값을 공유할 수 있는 방법을 보여줍니다.
make (chan Type)//等价于make (chan Type,0)
버퍼 크기가 지정되지 않으면 채널은 동기식이므로 발신자가 보낼 준비가 되고 수신자가 수신할 준비가 될 때까지 차단됩니다.
버퍼링된 채널은 수신되기 전에 하나 이상의 값을 저장할 수 있는 채널입니다.
이 유형의 채널에서는 고루틴이 전송과 수신을 동시에 완료해야 할 필요가 없습니다. 채널에는 보내기 및 받기 작업을 차단하는 다양한 조건도 있습니다. 수신 작업은 수신할 채널에 값이 없는 경우에만 차단됩니다. 전송 작업은 전송되는 값을 수용할 수 있는 버퍼가 채널에 없는 경우에만 차단됩니다.
이로 인해 버퍼링된 채널과 버퍼링되지 않은 채널 사이에 큰 차이가 발생합니다. 버퍼링되지 않은 채널은 고루틴을 보내고 받는 것이 동시에 데이터를 교환하도록 보장합니다. 버퍼링된 채널에는 그러한 보장이 없습니다.
make (chan Type,capacity)
버퍼 용량이 주어지면 채널은 비동기식입니다. 버퍼에 데이터 전송에 사용되지 않는 공간이 있거나 수신 가능한 데이터가 포함되어 있는 한 차단 없이 통신이 진행됩니다.
채널은 ok를 사용하여 채널이 아직 열려 있는지 여부를 감지할 수 있습니다. 채널이 닫혀 있으면 데이터를 읽을 수 없습니다.
num ,ok:=<-ch
채널이 닫혀 있는지 감지할 수 있습니다.기본적으로 채널은 이중 질문입니다. 즉, 데이터를 보내고 받을 수 있습니다.
그러나 매개변수로 전달된 채널을 자주 볼 수 있으며 그 값은 데이터를 전송하거나 데이터를 수신하는 데에만 한 방향으로 사용될 것으로 예상됩니다. 단방향 카멜 변수의 선언은 다음과 같이 매우 간단합니다.
var ch1 chan int //ch1双向
var ch2 chan<-float64 //ch2单向,只能用于写float64数据
var ch3 <-chan int //ch3单向,只能用于读int数据
chan<-은 데이터가 파이프에 들어가고 데이터가 파이프에 기록되어 호출자에게 출력됨을 의미합니다.
<-chan은 데이터가 파이프에서 나온다는 것을 나타냅니다. 호출자의 경우 파이프에서 데이터를 얻습니다. 이는 당연히 입력입니다.
채널은 묵시적으로 단방향 대기열(수신 전용 또는 송신 전용)로 변환될 수 있지만 단방향 채널은 일반 채널로 변환될 수 없습니다.