工作完成后 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 是不是退出的主要内容,如果未能解决你的问题,请参考以下文章

Go并发编程--正确使用goroutine

如何在处理结果时正确关闭 Goroutines 中的共享通道

Go36-16,17-goroutine

channel 和goroutine

等待 goroutine 完成的正确方法

并发——轻量级线程,通道,单向通道