取以下代码片段: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
)。
请注意,对于某些资源会在进程退出时由操作系统自动清理(例如打开文件、文件锁等),因此在某些情况下不需要特殊清理
- 2 回答
- 0 关注
- 200 浏览
添加回答
举报
0/150
提交
取消