主 Goroutine 退出或返回期间未完成的 Goroutine 的命运
在提供的示例代码中,创建 Goroutine 来处理对不同服务器的请求。主 Goroutine,mirroredQuery,返回最快的响应。问题出现了:当mirroredQuery完成时,未完成的例程(一个或两个)会发生什么?
主 Goroutine 返回中的突然终止
当主 Goroutine 返回时,它触发运行时系统突然关闭。这意味着任何在无缓冲或完整通道上等待通信的现有 goroutine 都会消失,而不会被取消或终止。他们没有主动奔跑或等待;相反,它们在主 goroutine 终止时不再存在。这种现象可以归类为 Goroutine 泄漏,但由于整个进程正在终止,这一现象得到了缓解。
在 Main Goroutine 运行时继续 Goroutine
但是,如果主 goroutine 保持活动状态(即未返回),则其他 goroutine 继续运行。它们要么完成任务并返回,要么执行导致终止的操作。在给定的示例中,未完成的例程检索响应,将其发送到通道,然后返回。这些例程在完成并返回后消失。
通道持久性和资源泄漏
通道在mirroredQuery返回后仍然存在,并且保留从goroutine接收到的字符串。这可以被视为轻微的资源泄漏,特别是在小程序中。如果不存在对该通道的其他引用,它最终将与其内容一起被垃圾收集。
与无缓冲通道和封闭通道的比较
在这种情况下对于无缓冲的通道,“丢失”的 goroutine 在尝试发送到完整通道时会阻塞。因此,这些 goroutine 和通道本身将持续存在,直到程序终止。关闭通道会导致“丢失”的 goroutine 恐慌,从而有效地终止程序。因此,使用缓冲通道可以简化代码,同时避免这些不良情况。
以上是当主 Goroutine 退出时,未完成的 Goroutines 会发生什么?的详细内容。更多信息请关注PHP中文网其他相关文章!