主出口或镜像查询返回时未解析的 Goroutines
考虑 Go 编程语言书中的代码片段,其中生成 goroutine 来检索来自多个 URL 的响应。主 goroutine 在收到来自响应通道的最快响应后退出。问题来了:当主协程或父协程退出或返回时,未完成的协程会发生什么?
主协程退出
正常情况下当主协程退出时(返回),整个运行时系统关闭。因此,任何在无缓冲或满通道上等待发送的 goroutine 都会突然停止存在,而不会被取消、运行或等待。这类似于闪存纸被点燃。
人们可能会将其称为 Goroutine 泄漏,类似于其他上下文中未关闭或未释放的资源。然而,由于整个过程终止,因此不存在真正的泄漏;资源不会无限期保留。系统本质上会进行快速清理。
主 Goroutine 运行时镜像查询返回
如果主 Goroutine 尚未退出且MirroredQuery() 函数已返回,则剩余的 goroutine 继续执行或等待,直到完成任务并返回。这包括等待响应、将其发送到通道并返回。返回后,它们被终止并蒸发。
通道本身仍然存在,保存着字符串,这可以被视为轻微的资源泄漏。但是,当对通道的最后一个引用消失时,此泄漏就会得到解决,从而提示通道(及其内容)被垃圾收集。
无缓冲通道
有代码片段中的通道没有缓冲,较慢的 goroutine 在尝试发送到通道时会阻塞。这将防止它们终止,保持分配的通道和资源直到程序结束。这种情况是不可取的。
缓冲通道和最干净的代码
在代码片段中使用缓冲通道是确保所需功能而不会出现潜在错误或错误的最简单方法。资源泄漏。它允许较慢的 goroutine 完成任务并优雅地终止。
结论
主出口处未完成的 goroutine 的命运是突然终止。当镜像查询返回而主 goroutine 仍在运行时,剩余的 goroutine 会完成其任务并消失。使用缓冲通道可以解决与此上下文中未完成的 goroutine 相关的任何潜在资源泄漏问题。
以上是当 Go 主例程退出时,未完成的 Goroutine 会发生什么?的详细内容。更多信息请关注PHP中文网其他相关文章!