選擇阻塞執行的 Goroutine
使用 Go 並發模式時,可以使用 Goroutine 來執行非同步任務。然而,有時這些 Goroutine 可能會進入無限循環,導致程式無法繼續運行。
案例研究:爬蟲函數
在 Go Tour 練習 #71 中, crawl 函式利用 Goroutines 和 select 語句來爬取一組 URL。但是,如果 select 語句中包含 default 子句,Goroutine 將會被阻塞並且執行停止。
理解 Select
select 語句是去管理並發。它允許 goroutine 在多個通道上等待資料或事件。如果沒有預設子句,select 將無限期地阻塞,直到訊息到達其中一個通道。
預設子句的影響
新增預設子句會改變其行為給 select。當任何通道上沒有可用資料時,預設語句將立即執行,而不是阻塞。在抓取函數中,這種行為會造成無限循環。
解
要防止無限循環,可以從 select 語句中刪除 default 子句。或者,可以實作一個非阻塞 select 語句,定期檢查通道上的可用資料。
調度程序行為
Goroutines 是協作調度的,這意味著它們必須自願將控制權交給調度程序以允許其他 Goroutine 運行。在這種情況下,select語句中的無限迴圈阻止了調度程式呼叫其他Goroutine,從而導致明顯的阻塞行為。
額外觀察
以上是為什麼 Go 的 select 語句中的 Default 子句會阻止爬行函數中的 Goroutine 執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!