首頁 > 後端開發 > Golang > 在 Go 1.5 之前和之後,`runtime.Gosched()` 對 Go 程式的執行有何影響?

在 Go 1.5 之前和之後,`runtime.Gosched()` 對 Go 程式的執行有何影響?

Susan Sarandon
發布: 2024-12-30 14:37:16
原創
776 人瀏覽過

How Does `runtime.Gosched()` Impact Go Program Execution Before and After Go 1.5?

Gosched 如何影響 Go 程式的執行

問題

在 1.5 之前的 Go 版本中,一段涉及到 runtime.Gosched()的程式碼被觀察到影響輸出程式:

func say(s string) {
    for i := 0; i < 5; i++ {
        runtime.Gosched()
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}
登入後複製

帶runtime.Gosched()的輸出:

hello
world
hello
world
hello
world
hello
world
hello
登入後複製

不含runtime.Gosched()的輸出:

hello
hello
hello
hello
hello
登入後複製

說明

在1.5 之前的Go在版本中,runtime.Gosched() 明確地將控制權交給了其他被呼叫時的 goroutine。雖然 Go 程式預設在單一作業系統執行緒上運行,但 runtime.Gosched() 允許調度程序在 goroutine 之間切換執行。

當 GOMAXPROCS 未設定或設定為 1 時,Go 的協作多工處理需要 goroutine 明確讓出控制權。因此,在上面的程式碼範例中,「world」輸出僅在呼叫 runtime.Gosched() 時出現,因為它允許調度程式切換到執行「world」列印語句的 goroutine。

GOMAXPROCS 和協作多任務

在 Go 1.5 及更高版本中,runtime.GOMAXPROCS 預設為硬體核心數,這表示 Go 可能會建立多個 OS 執行緒運行 goroutines。

將 GOMAXPROCS 設定為大於 1 的值,goroutine 可以並行運作。然而,與搶佔式多任務系統不同,goroutines 仍然必須明確地讓出控制權以允許其他 goroutine 執行。這是因為 Go 使用協作式多工處理,其中 goroutine 自願將控制權交給調度程序。

平行性的影響

當 GOMAXPROCS 設定為大於 1 的值時,交錯 goroutine 的結果可能會變得不確定,因為調度程式可以隨時在它們之間切換執行。這可能會導致不可預測的輸出模式,如上面的範例所示,當 GOMAXPROCS 設定為 2 時。

以上是在 Go 1.5 之前和之後,`runtime.Gosched()` 對 Go 程式的執行有何影響?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板