在Go Playground 上執行程式碼時,開發人員可能會遇到與在本機上執行相同程式碼相比的差異。本文探討了行為差異,特別是在處理 goroutine 和同步機制時。
考慮以下 Go 代碼:
package main
import (
"fmt"
)
func other(done chan bool) {
done 在 Go Playground 上,此程式碼會產生錯誤:「進程花費的時間太長。」這表示在另一個函數中建立的 goroutine 無限期地運行。
但是,在具有多個 CPU 核心 (GOMAXPROCS > 1) 的本機電腦上執行相同的程式碼會產生以下輸出:
Hello, playground
Finished.
這意味著當主 Goroutine 完成時,在其他 Goroutine 中創建的 Goroutine 也會終止。
解釋行為差距
Go Playground 和本地機器之間的不同行為可以歸因於可用處理器的數量。在 Go Playground 上,GOMAXPROCS 預設為 1,這意味著一次只能運行一個 Goroutine。因此,在上面的例子中,other內創建的無盡的goroutine會阻止主goroutine繼續執行。
相反,當本地多CPU核運行時,GOMAXPROCS預設為可用核數,允許多個goroutine同時運行。因此,在 other 中創建的無限 goroutine 不會阻止主 goroutine 退出。
結論
Go 中 goroutine 的行為取決於可用處理器的數量 (GOMAXPROCS)。雖然 Go Playground 使用預設值 1,這可能會導致 goroutine 無限期運行的感覺,但在具有多個核心的本機電腦上運行相同的程式碼會提供不同的行為,其中 goroutine 可能會在主 goroutine 完成時終止。這種理解有助於開發人員避免誤解並確保他們的程式碼在不同環境中按預期運行。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3