Golang의 채널 출력 순서 이해
Golang에서 버퍼링되지 않은 채널은 고루틴 간의 안정적인 통신 메커니즘을 제공합니다. 그러나 출력 순서는 때때로 혼란스러울 수 있습니다. 다음 코드를 고려해보세요.
func main() { messages := make(chan string) go func() { messages <- "hello" }() go func() { messages <- "ping" }() msg := <-messages msg2 := <-messages fmt.Println(msg) fmt.Println(msg2) }
이 코드를 실행하면 "ping"과 "hello"가 일관되게 인쇄됩니다. 출력이 고루틴이 생성된 순서와 일치할 것으로 예상할 수 있으므로 이는 직관에 어긋나는 것처럼 보일 수 있습니다.
이런 일이 발생하는 이유를 이해하려면 고루틴은 병렬 작업을 나타내는 반면 채널은 통신 파이프라인이라는 점을 기억하는 것이 중요합니다. 고루틴이 특정 순서로 생성되더라도 실행 순서는 보장되지 않습니다.
이 경우 스케줄러는 "hello"를 보내는 고루틴보다 먼저 "ping"을 보내는 고루틴을 예약했을 수 있습니다. 첫 번째 수신자(예: msg := <-messages)가 사용 가능해지면 이미 예약된 "ping" 고루틴의 메시지를 수락합니다.
첫 번째 메시지를 수신하면 프로그램이 계속 실행됩니다. 두 번째 수신자(msg2 :=
따라서 채널에 쓰는 고루틴의 실행 순서에 따라 출력 순서가 결정됩니다. , 메시지가 생성된 순서나 채널에서 메시지를 읽는 순서가 아닙니다. 이를 확인하려면 제공된 답변에 제안된 대로 Println 문을 고루틴에 추가할 수 있습니다.
... func() { messages <- "hello"; fmt.Println("Hello sent") }() func() { messages <- "ping"; fmt.Println("Ping sent") }() ...
이 결과는 다음과 같습니다.
Hello sent Ping sent ping hello
이것은 메시지가 전송되었음을 확인합니다. 같은 순서로 인쇄됩니다.
위 내용은 Golang의 버퍼링되지 않은 채널 출력 순서가 직관적이지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!