请使用以下代码段:
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).
请注意,对于某些资源,操作系统会在进程退出时自动清除(例如打开文件,文件锁等),因此在某些情况下不需要进行特殊清理