请使用以下代码段:
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()
没有打开文件描述符或套接字或任何不好的东西。
答案 0 :(得分:20)
As mentioned in the spec,当main
函数完成时,您的程序将退出:
程序执行从初始化主包然后调用函数
main
开始。当该函数调用返回时,程序退出。它不会等待其他(非main
)goroutines完成。
因此,从语言的角度来看,你还有其他goroutine运行的事实并不是问题。它可能仍然是一个问题,取决于您的程序正在做什么。
如果goroutine创建了一些应该在程序退出之前清理的资源,那么在中途执行停止可能是个问题:在这种情况下,你应该让你的main
函数等待它们到先完成。没有与pthread_join
等效的内容,因此您需要自己编写代码(例如,使用频道或sync.WaitGroup
)。
请注意,某些资源会在进程退出时由操作系统自动清除(例如打开文件,文件锁等),因此在某些情况下不需要进行特殊清理
答案 1 :(得分:1)
Goroutines不是线程,它们非常轻量级,运行时会在它们不再运行时自动清除它们,或者程序退出。