>백엔드 개발 >Golang >Golang의 버퍼링되지 않은 채널 출력 순서가 직관적이지 않은 이유는 무엇입니까?

Golang의 버퍼링되지 않은 채널 출력 순서가 직관적이지 않은 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-16 21:15:12323검색

Why Does Golang's Unbuffered Channel Output Order Seem Counterintuitive?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.