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

jos*_*h42 18 go goroutine

请使用以下代码段:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

goroutine应该在执行期间运行.当select语句从退出通道接收到某些内容时,它会跳出循环并且程序结束,而不会尝试停止goroutine.

我的问题:这会产生一次或两次不明显的间歇性不良反应吗?我知道在其他语言中,线程应该在程序结束之前清理(即退出),但是会有所不同吗?假设querySomePeriodicThing()不会打开文件描述符或套接字或任何不好的东西.

Jam*_*dge 24

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

程序执行从初始化主包然后调用该函数开始main.当该函数调用返回时,程序退出.它不等待其他(非main)goroutines完成.

因此,从语言的角度来看,你还有其他goroutine运行的事实不是问题.它可能仍然是一个问题,取决于您的程序正在做什么.

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

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

  • 额外的问题:在主要退出之后,它在go例程中运行`defer`语句,还是那些被切断的死亡? (3认同)