当我这样做
done := make(chan bool)
for i := 0; i < 10; i++ {
go func() {
done <- true
}()
}
<-done
Run Code Online (Sandbox Code Playgroud)
而不是这个
done := make(chan bool)
for i := 0; i < 10; i++ {
go func() {
done <- true
}()
}
for i := 0; i < 10; i++ {
<-done
}
Run Code Online (Sandbox Code Playgroud)
如果我不关闭它们,我会泄漏goroutines吗?有什么工具可以检测我何时忘记关闭goroutines?
是的,您在第一个示例中泄漏了 9 个 goroutine。
我不相信有任何工具可以告诉你这一点。
如果有一种方法可以查询所有现有的非系统(即 gc)goroutine,那将是一件有趣的事情。
可能可以用:runtime.Stack做一些事情,但它对于给定的代码库来说是超级特定的,因为你可能有一些“好的”goroutine和一些“流氓”的goroutines。
更新:2016 年 2 月 4 日
我对此感到好奇,所以我制作了一个非常简单(并且命名很糟糕)的库来随着时间的推移对 goroutine 进行比较。一个简单的检漏仪。 https://github.com/dbudworth/greak