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 的順序被處決。它是不確定的,這意味著執行順序可能會根據硬體和作業系統等因素而變化。在這個例子中:
但是,排程器也有可能在 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中文網其他相關文章!