Go의 채널 출력 순서 이해
주어진 Go 코드 조각에는 버퍼링되지 않은 채널을 사용하여 고루틴 간 통신이 포함됩니다. 코드는 차단 동작으로 인해 "hello"를 인쇄한 다음 "ping"을 인쇄할 것으로 예상되지만 "ping"과 "hello"를 일관되게 인쇄합니다. 이는 채널에 메시지를 쓰고 읽는 순서에 대한 의문을 제기합니다.
코드에서 알 수 있듯이 버퍼링되지 않은 채널은 데이터를 사용할 수 있을 때까지 발신자와 수신자를 모두 차단합니다. 즉, go 루틴이 채널에 쓰기를 시도하면 메시지가 읽혀질 때까지 차단됩니다.
실행 시 코드는 "hello" 및 "ping" 쓰기를 시도하는 두 개의 go 루틴을 분기합니다. 채널. 즉시 사용할 수 있는 수신기가 없으므로 두 루틴이 모두 차단됩니다.
첫 번째 읽기 작업(msg := <-messages)이 발생할 때 프로그램은 대기 중인 고루틴을 임의로 선택하지 않습니다. 대신 채널에 이미 기록된 항목이 선택됩니다. 이는 항상 "hello" 앞에 쓰여지는 "ping"이 항상 msg에 할당되는 이유를 설명합니다.
따라서 인쇄되는 메시지의 순서는 비결정적인 고루틴 실행 순서에 따라 결정됩니다. 채널에 쓰는 goroutine에 print 문을 추가하면 쓰기 순서가 채널에서 읽는 메시지 순서와 일치하는지 확인할 수 있습니다.
위 내용은 My Go Unbuffered 채널이 예기치 않은 순서로 메시지를 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!