Go 동시성 및 채널 혼란: 고루틴 실행 순서 이해
Go에서 동시성은 고루틴, 즉 애플리케이션 내에서 동시에 실행되는 경량 스레드를 통해 달성됩니다. 단일 프로세스. 채널은 고루틴 간의 통신 수단을 제공합니다. 그러나 고루틴과 채널이 어떻게 상호 작용하는지 이해하는 것은 특히 초보자에게 어려울 수 있습니다.
이 문서에서는 고루틴 실행 순서 및 채널 통신과 관련된 일반적인 혼동 지점을 살펴봅니다. 제공된 예제 프로그램:
<code class="go">package main import "fmt" func display(msg string, c chan bool) { fmt.Println("display first message:", msg) c <- true } func sum(c chan bool) { sum := 0 for i := 0; i < 10000000000; i++ { sum++ } fmt.Println(sum) c <- true } func main() { c := make(chan bool) go display("hello", c) go sum(c) <-c }</code>
이 프로그램은 "첫 번째 메시지 표시: hello"를 첫 번째 출력으로 인쇄하고 이어서 합계 계산 결과를 인쇄할 것으로 예상됩니다. 그러나 어떤 경우에는 표시 기능이 데이터를 채널에 보내기 전에 합계 계산이 완료됩니다.
설명:
Go의 스케줄러는 고루틴이 실행되는 순서를 결정합니다. 실행됩니다. 이는 비결정적입니다. 즉, 실행 순서는 하드웨어 및 운영 체제와 같은 요인에 따라 달라질 수 있습니다. 이 예에서:
그러나 디스플레이 고루틴이 채널에 데이터를 보내기 전에 스케줄러가 합계 고루틴을 실행하여 완료하는 것도 가능합니다. 이 경우 출력은 다음과 같습니다.
10000000000 display first message: hello
해결책:
표시 메시지가 합계 결과 전에 인쇄되도록 하려면 결과를 사용할 수 있습니다. 채널을 사용하여 첫 번째 결과를 수신하고 프로그램을 종료합니다. 수정된 주요 기능은 다음과 같습니다:
<code class="go">func main() { result := make(chan string) go display("hello", result) go sum(result) fmt.Println(<-result) }</code>
위 내용은 내 Go 프로그램이 때때로 \"첫 번째 메시지 표시\" 전에 합계 결과를 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!