理解 time.sleep 在 Goroutine 執行中的作用
在 Go 中,goroutine 是輕量級的並發執行執行緒。雖然將 goroutine 與通道通訊相結合可以提供強大的並發原語,但某些場景需要使用 time.sleep 等阻塞函數來防止飢餓並確保執行的公平性。
請考慮 Go 教程中的以下程式碼片段:
package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") }
執行時,此程式碼會在螢幕上交替列印「hello」和「world」五次。但是,如果 time.Sleep 被註解掉,則只會列印「hello」。這個行為凸顯了 goroutine 執行中 time.Sleep 的重要性。
Go 執行時期調度程式不是搶佔式的。這意味著 goroutine 必須自願放棄控制權才能允許其他 goroutine 執行。釋放控制的一種方法是使用 time.Sleep。
在上面的程式碼片段中,如果刪除 time.Sleep,「hello」goroutine 將運行五次迭代,而不給「world」goroutine任何機會執行。結果,當「hello」goroutine結束時,程式會因為沒有任何其他goroutine保持活動而終止。
因此,time.Sleep在確保goroutine調度的公平性方面起著至關重要的作用。透過在特定 Goroutines 的執行中引入短暫的延遲,它允許其他 Goroutines 被執行並防止其他 Goroutines 飢餓或完全飢餓。
以上是Go 中的 time.Sleep() 如何防止 Goroutine Starvation?的詳細內容。更多資訊請關注PHP中文網其他相關文章!