首頁  >  文章  >  後端開發  >  為什麼我的 Go 程式有時會在「顯示第一則訊息」之前列印求和結果?

為什麼我的 Go 程式有時會在「顯示第一則訊息」之前列印求和結果?

DDD
DDD原創
2024-10-30 18:16:03803瀏覽

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

Go 並發和通道混亂:了解Goroutine 執行順序

在Go 中,並發是透過goroutine 實現的,goroutine 是在一個並發outine 是在一個並發outine 是在一個並發outine 是在一個並發outine 是在一個並發outine運行的輕量級執行緒。單一進程。通道提供了 goroutine 之間通信的一種方式。然而,理解 goroutine 和通道如何互動可能具有挑戰性,尤其是對於初學者來說。

本文探討了與 goroutine 執行順序和通道通訊相關的常見困惑點。提供的範例程式:

<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 中的調度程序決定 goroutine 的順序被處決。它是不確定的,這意味著執行順序可能會根據硬體和作業系統等因素而變化。在這個例子中:

  1. main函數創建了兩個goroutine:display和sum。
  2. 調度器選擇先切換到display goroutine,它會列印「顯示第一個訊息」行.
  3. display goroutine 在嘗試向通道發送資料時被阻塞(c
  4. 調度器選擇執行 sum goroutine,它執行計算量大的循環。
  5. 一旦 sum 計算完成,sum goroutine 就會將資料傳送到通道。
  6. main 函數從通道接收資料並退出。

但是,排程器也有可能在 Display Goroutine 將資料傳送到通道之前將 sum Goroutine 執行完成。在這種情況下,輸出將為:

10000000000
display first message: hello

解決方案:

為了確保在求和結果之前列印顯示訊息,可以使用結果通道接收第一個結果並退出程序。修改後的 main 函數為:

<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