当 Go 程序中主 Goroutine 或父 Goroutine 退出时,未完成的 Goroutine 将面临突然结束。整个运行时系统关闭,没有空间让它们继续运行、等待或取消。这种现象就像闪光纸瞬间点燃又消失。
Go编程书中给出的代码片段中,mirroredQuery返回时,如果主goroutine退出,那么两个慢goroutine将不复存在立即,无论他们当前的状态如何。这可以认为是goroutine泄漏,但由于整个进程终止,分配的资源会自动清理。
但是,如果mirroredQuery返回后主goroutine仍在运行,则未完成的goroutines将继续运行,直到他们:
在这种情况下,他们会将响应发送到通道然后返回。一旦所有 goroutine 返回,通道将保留响应作为次要资源泄漏。但由于没有剩余的对通道的引用,它最终将与其包含的字符串一起被垃圾收集。
在这种情况下使用缓冲通道可确保 goroutine 不会阻塞并继续运行,直到它们完成为止。能够完成他们的任务。在无缓冲通道的情况下,失败的 goroutine 将阻塞,导致通道及其资源无限期地保持分配状态。
以上是当父 Goroutine 退出时,未完成的 Goroutines 会发生什么?的详细内容。更多信息请关注PHP中文网其他相关文章!