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

时间:2014-08-27 03:34:41

标签: 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
        }
    }
}

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

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

2 个答案:

答案 0 :(得分:20)

As mentioned in the spec,当main函数完成时,您的程序将退出:

  

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

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

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

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

答案 1 :(得分:1)

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