工作完成后 goroutine 是不是退出
Posted
技术标签:
【中文标题】工作完成后 goroutine 是不是退出【英文标题】:Does a goroutine exit when the work has completed工作完成后 goroutine 是否退出 【发布时间】:2022-01-17 04:13:59 【问题描述】:我有一个 go 程序,它是一项服务,预计在发生崩溃或故意关闭之前不会退出。
在这个程序中,我订阅了一个消息队列。订阅方法运行一系列我希望同时运行的事件。我不需要等到它们完成。
这些 goroutine 并不总是使用通道,有时它只是我想并发运行的一个执行块。下面的示例 - goroutine 调用 fmt.Printf() 两次。在这两个调用之后,它是否完成并被 GC 清理,还是我需要显式关闭它?
messageQueue.Subscribe("topic/print", topicPrint)
func topicPrint()
go func ()
fmt.Println("Here is some topic information")
fmt.Println(topic.Title, topic.Body)
()
【问题讨论】:
Does a goroutine exit when the work has completed
假设 goroutine 的 the work
以它的主体开始并以它的主体结束,是的。 After those two calls, does it complete
无法保证,除非您同步所有这些,否则它可能会突然停止。 and get cleaned up by the GC
np,GC 将适用于那些条件正常的人。 , or do I need to explicitly close it?
没有。您需要管理内存中的活动对象,但是 GC 可以找出这些数据没有链接到任何运行时对象,然后它会清理。 google.com/search?q=go+gc+tricolor
【参考方案1】:
像您的示例中那样从 goroutine 的末尾流出是结束它的正确方法。无需明确“清理”。
Go 运行时自动“收获”完成的 goroutine,尽可能地重用资源(实际上发生的是实现细节,可能会发生变化)。
【讨论】:
【参考方案2】:Go 例程就像执行线程,它们执行代码,完成后由 GC 清理。
如果您需要长期存在的 goroutine(想想线程),您需要告诉它。您可以使用通道与您的 goroutine 进行通信;使用for
循环和select
语句。
查看https://gobyexample.com/goroutines 了解具体示例。
注意,如果你告诉它不要退出,你也需要告诉它什么时候退出。例如,这可以通过关闭频道来完成。
【讨论】:
以上是关于工作完成后 goroutine 是不是退出的主要内容,如果未能解决你的问题,请参考以下文章