为了账号安全,请及时绑定邮箱和手机立即绑定

可以退出带有活动 goroutine 的程序吗?

可以退出带有活动 goroutine 的程序吗?

Go
繁星淼淼 2021-08-10 20:46:40
取以下代码片段:func main() {    ch := make(chan int)    quit := make(chan int)    go func() {        for {            ch <- querySomePeriodicThing()        }    }()    // ...loop:    for {        select {        case <-ch: handlePeriodicThing()        case <-quit: break loop        }    }}goroutine 应该在执行期间运行。当 select 语句从退出通道接收到一些东西时,它会跳出循环并结束程序,而不会尝试停止 goroutine。我的问题:这是否会产生任何间歇性的不良影响,而这些不良影响在运行一次或两次时并不明显?我知道在其他语言中,线程应该在程序结束之前清理(即退出),但是会有所不同吗?假设querySomePeriodicThing()不打开文件描述符或套接字或任何不打开的东西。
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

如规范中所述,您的程序将在main函数完成时退出:

程序执行首先初始化主包,然后调用函数main。当该函数调用返回时,程序退出。它不会等待其他(非main)goroutine 完成。

因此,从语言的角度来看,您还有其他 goroutine 仍在运行这一事实并不是问题。根据您的程序在做什么,它可能仍然是一个问题。

如果 goroutine 创建了一些应该在程序退出前清理的资源,那么在中途停止执行可能是一个问题:在这种情况下,你应该让你的main函数先等待它们完成。没有等价于pthread_join,因此您需要自己编写代码(例如,通过使用频道或sync.WaitGroup)。

请注意,对于某些资源会在进程退出时由操作系统自动清理(例如打开文件、文件锁等),因此在某些情况下不需要特殊清理


查看完整回答
反对 回复 2021-08-10
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

Goroutines 不是线程,它们非常轻量级,当它们不再运行或程序退出时,运行时会自动清理它们。


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信