主出口或鏡像查詢返回時未解析的Goroutines
考慮Go 程式語言書中的程式碼片段,其中產生goroutine 來檢索來自多個URL 的回應。主 goroutine 在收到來自回應通道的最快回應後退出。問題來了:當主協程或父協程退出或返回時,未完成的協程會發生什麼?
主協程退出
正常情況下當主協程退出時(返回),整個運行時系統關閉。因此,任何在無緩衝或滿通道上等待發送的 goroutine 都會突然停止存在,而不會被取消、運行或等待。這類似於閃存紙被點燃。
人們可能會稱之為 Goroutine 洩漏,類似於其他上下文中未關閉或未釋放的資源。然而,由於整個過程終止,因此不存在真正的洩漏;資源不會無限期保留。系統本質上會進行快速清理。
主Goroutine 運行時鏡像查詢返回
如果主Goroutine 尚未退出且MirroredQuery() 函數已返回,則剩餘的goroutine 繼續執行或等待,直到完成任務並返回。這包括等待回應、將其發送到通道並返回。返回後,它們被終止並蒸發。
通道本身仍然存在,保存著字串,這可以被視為輕微的資源洩漏。但是,當通道的最後一個引用消失時,此洩漏就會解決,從而提示通道(及其內容)被垃圾收集。
無緩衝通道
有程式碼片段中的通道沒有緩衝,較慢的 goroutine 在嘗試傳送到通道時會阻塞。這將防止它們終止,並保持分配的通道和資源直到程式結束。這種情況是不可取的。
緩衝通道和最乾淨的程式碼
在程式碼片段中使用緩衝通道是確保所需功能而不會出現潛在錯誤或錯誤的最簡單方法。資源洩漏。它允許較慢的 goroutine 完成任務並優雅地終止。
結論
主出口處未完成的 goroutine 的命運是突然終止。當鏡像查詢返回而主 goroutine 仍在運行時,剩餘的 goroutine 完成其任務並消失。使用緩衝通道可以解決與此上下文中未完成的 goroutine 相關的任何潛在資源洩漏問題。
以上是當 Go 主例程退出時,未完成的 Goroutine 會發生什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!