主Goroutine 退出或返回期間未完成的Goroutine 的命運
在提供的範例程式碼中,建立對不同伺服器的請求。主 Goroutine,mirroredQuery,回傳最快的回應。問題出現了:當mirroredQuery完成時,未完成的例程(一個或兩個)會發生什麼?
主 Goroutine 返回中的突然終止
當主 Goroutine 返回時,它觸發運行時系統突然關閉。這意味著任何在無緩衝或完整通道上等待通訊的現有 goroutine 都會消失,而不會被取消或終止。他們沒有主動奔跑或等待;相反,它們在主 goroutine 終止時不再存在。這種現象可以歸類為 Goroutine 洩漏,但由於整個進程正在終止,這一現象得到了緩解。
在 Main Goroutine 運行時繼續 Goroutine
但是,如果主 goroutine 保持活動狀態(即未返回),則其他 goroutine 繼續運行。它們要么完成任務並返回,要么執行導致終止的操作。在給定的範例中,未完成的例程會擷取回應,將其傳送到通道,然後返回。這些例程在完成並返回後消失。
通道持久性和資源洩漏
通道在mirroredQuery返回後仍然存在,並且保留從goroutine接收的字串。這可以被視為輕微的資源洩漏,特別是在小程式中。如果不存在對該通道的其他引用,它最終將與其內容一起被垃圾收集。
與無緩衝通道和封閉通道的比較
在這種情況下對於無緩衝的通道,「丟失」的goroutine 在嘗試發送到完整通道時會阻塞。因此,這些 goroutine 和通道本身將持續存在,直到程式終止。關閉通道會導致「遺失」的 goroutine 恐慌,從而有效地終止程式。因此,使用緩衝通道可以簡化程式碼,同時避免這些不良情況。
以上是當主 Goroutine 退出時,未完成的 Goroutines 會發生什麼事?的詳細內容。更多資訊請關注PHP中文網其他相關文章!