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

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

Mary-Kate Olsen
풀어 주다: 2024-12-16 21:15:12
원래의
316명이 탐색했습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿