【问题标题】:Is there a tool to detect when I forget to close goroutines?是否有工具可以检测我何时忘记关闭 goroutine?
【发布时间】:2016-05-02 14:04:24
【问题描述】:

当我这样做时

done := make(chan bool)
for i := 0; i < 10; i++ {
    go func() {
        done <- true
    }()
}
<-done

而不是这个

done := make(chan bool)
for i := 0; i < 10; i++ {
    go func() {
        done <- true
    }()
}
for i := 0; i < 10; i++ {
    <-done
}

如果我不关闭 goroutine,我是否会泄漏 goroutine?是否有工具可以检测我何时忘记关闭 goroutine?

【问题讨论】:

  • leak 总是绑定到业务(你的代码想要做什么)。如果你的程序运行良好,离开例程,那不是leak。我的看法
  • @JiangYD 你说得对,我将问题编辑得更准确。
  • runtime.GoroutineProfile 拥有所有正在运行的 goroutine 及其堆栈跟踪。也许更好,this answer describes using runtime/pprof 打印整个痕迹。当然,这取决于您是否需要确定运行的例程数量。

标签: go


【解决方案1】:

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

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

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

也许可以用:runtime.Stack 做点什么,但它会是超级具体的 到给定的代码库,因为你可能有一些“好”的 goroutine 和一些“流氓”的。

更新:2016 年 2 月 4 日

我对此很好奇,所以我创建了一个非常简单(而且名字很吓人)的库来随着时间的推移对 goroutines 进行比较。一个简单的检漏仪。 https://github.com/dbudworth/greak

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 2020-07-09
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多