Goroutine 什麼時候可以讓出執行?
在 Go 程式中,goroutine,輕量級的執行線程,可以在什麼時候讓出其他 goroutine不同的點,實現並發和高效的資源利用。然而,並非所有 goroutine 執行都會屈服。
傳統上,已知 goroutine 主要在面對阻塞系統呼叫 (syscals) 時屈服。然而,正如先前的討論中所指出的,函數呼叫也可以在堆疊增長檢查期間觸發 goroutine 切換。
問題中描述的行為,即即使沒有函數調用或系統調用,goroutine 也會產生結果,已透過Go 1.14 版本中引入了非同步搶佔。此增強功能使 goroutine 能夠在執行過程中的幾乎所有點被搶佔,即使在沒有函數呼叫的無限循環中也是如此。
雖然非同步搶佔顯著提高了調度程式的回應能力,但需要注意的是,搶佔點可能會被搶佔。不同的 Go 版本有所不同。因此,通常不建議依賴特定的搶佔點來實現同步。
在問題中提供的範例程式碼中,輸出陣列和 oi 索引缺乏同步,使得屈服行為的分析變得複雜。在輸出數組中使用字串可能會涉及垃圾回收,從而引入調度點。
本質上,Go 中的 goroutine 在各個點上產生執行,包括系統呼叫、函數呼叫和可能發生的非同步搶佔點幾乎任何地方。非同步搶佔顯著改善了 goroutine 調度行為,但必須避免依賴特定搶佔點進行同步。
以上是Go 中的 Goroutines 何時屈服?的詳細內容。更多資訊請關注PHP中文網其他相關文章!