我在用goroutines和channels写一些golang并发代码,怀疑我的代码可能会导致goroutine泄露。我的情况类似下面的代码,或者你可以打开这个go playground链接。
func main() {
numCount := 3
numChan := make(chan int)
for i := 0; i < numCount; i++ {
go func(num int) {
fmt.Printf("Adding num: %d to chan\n", num)
numChan <- num
fmt.Printf("Adding num: %d to chan Done\n", num)
}(i)
}
time.Sleep(time.Second)
panic("Goroutine Resource Leak Test")
}
在我看来,当主 goroutine 返回时,三个 goroutine 被阻止发送到无缓冲通道,并且会出现 goroutine 泄漏。表明So only if the channel was unbuffered the leak would occur
.
Go 编程语言建议:
我们可以在测试期间使用一个方便的技巧:如果我们不在取消事件中从 main 返回,而是执行对 panic 的调用,那么运行时将转储程序中每个 goroutine 的堆栈。如果主 goroutine 是唯一剩下的 goroutine,那么它已经完成了自己的清理工作。但是如果还有其他goroutines,可能是没有正确取消,或者已经取消了,但是取消需要时间;进行一些调查可能是值得的。恐慌转储通常包含足够的信息来区分这些情况。
因此,我panic("Goroutine Resource Leak Test")
在 main 函数的末尾添加来验证我的假设。但是,panic dump 仅包含 main goroutine,即没有资源泄漏。
Adding num: 0 to chan
Adding num: 1 to chan
Adding num: 2 to chan
panic: Goroutine Resource Leak Test
goroutine 1 [running]:
main.main()
/tmp/sandbox011109649/prog.go:21 +0xc0
谁能帮忙解释一下
为什么没有 goroutine 泄漏,或者
如果有泄漏,我应该如何获得正确的恐慌转储
任何建议将不胜感激,在此先感谢!
犯罪嫌疑人X
相关分类