在 Go 的早期版本中,當 runtime.Gosched()執行時,下面的程式碼表現出意外的行為刪除:
package main import ( "fmt" "runtime" ) 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.Gosch ed()的輸出:
hello hello hello hello hello
當Go運行時沒有指定GOMAXPROCS環境變量,所有goroutine被安排在單一作業系統線程中執行。為了使程式看起來是多線程的,Go 調度程序必須偶爾切換執行上下文。
協作多工:
Go 使用協作多工模型,這意味著 goroutine 必須明確讓出控制權到其他 goroutine。這與作業系統執行緒中的搶佔式多任務形成對比,其中調度程序透明地切換執行上下文。
runtime.Gosched() 的功能:
在沒有搶佔式多任務的情況下,runtime.Gosched() 允許goroutine 將控制權排程程式。當一個 Goroutine 到達 Gosched 呼叫時,調度程序指示它將執行切換到另一個 Goroutine。
在提供的範例中,刪除 Gosched 表示執行上下文永遠不會離開主例程。因此,「world」goroutine 永遠不會被允許運行,並且不會列印任何「world」訊息。
將 GOMAXPROCS 設為正數(例如,runtime.GOMAXPROCS(2)) 允許 Go 建立最多該數量的本機執行緒。如果 GOMAXPROCS 大於 1,則可以將 goroutine 排程在不同的執行緒中運行,從而實現真正的並行性。
當 GOMAXPROCS 設定為 2 或以上時,範例中的 goroutine 將交錯,即使沒有執行時間。 Gosched (),示範搶佔式多工處理。
以上是為什麼 `runtime.Gosched()` 對於單線程 Go 程式中交錯 Goroutine 輸出至關重要?的詳細內容。更多資訊請關注PHP中文網其他相關文章!