>  기사  >  백엔드 개발  >  내 Go 프로그램이 때때로 \"첫 번째 메시지 표시\" 전에 합계 결과를 인쇄하는 이유는 무엇입니까?

내 Go 프로그램이 때때로 \"첫 번째 메시지 표시\" 전에 합계 결과를 인쇄하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-30 18:16:03725검색

 Why does my Go program sometimes print the sum result before the

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의 스케줄러는 고루틴이 실행되는 순서를 결정합니다. 실행됩니다. 이는 비결정적입니다. 즉, 실행 순서는 하드웨어 및 운영 체제와 같은 요인에 따라 달라질 수 있습니다. 이 예에서:

  1. 주 함수는 두 개의 고루틴(display 및 sum)을 생성합니다.
  2. 스케줄러는 먼저 디스플레이 고루틴으로 전환하도록 선택하여 "display first message" 줄을 인쇄합니다. .
  3. 아직 수신자가 없기 때문에 채널에 데이터를 전송하려고 하면 디스플레이 고루틴이 차단됩니다(c <- true).
  4. 스케줄러는 합계 고루틴을 실행하도록 선택합니다. 이는 계산 비용이 많이 드는 루프를 실행합니다.
  5. 합계 계산이 완료되면 합 고루틴은 채널로 데이터를 보냅니다.
  6. 메인 함수는 채널에서 데이터를 수신하고 종료됩니다.

그러나 디스플레이 고루틴이 채널에 데이터를 보내기 전에 스케줄러가 합계 고루틴을 실행하여 완료하는 것도 가능합니다. 이 경우 출력은 다음과 같습니다.

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

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