是否有工具可以检测何时忘记关闭goroutines?

Ger*_*ens 5 go

当我这样做

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?

Dav*_*rth 4

是的,您在第一个示例中泄漏了 9 个 goroutine。

我不相信有任何工具可以告诉你这一点。

如果有一种方法可以查询所有现有的非系统(即 gc)goroutine,那将是一件有趣的事情。

可能可以用:runtime.Stack做一些事情,但它对于给定的代码库来说是超级特定的,因为你可能有一些“好的”goroutine和一些“流氓”的goroutines。

更新:2016 年 2 月 4 日

我对此感到好奇,所以我制作了一个非常简单(并且命名很糟糕)的库来随着时间的推移对 goroutine 进行比较。一个简单的检漏仪。 https://github.com/dbudworth/greak