【发布时间】:2020-06-26 08:31:19
【问题描述】:
我正在阅读这篇博客 https://medium.com/golangspec/goroutine-leak-400063aef468,并调整了以下示例,说明由于从 nil 通道接收而导致的 goroutine 泄漏:
package main
import (
"flag"
"fmt"
"runtime"
"time"
)
var initChannel bool
func main() {
flag.Parse()
var ch chan int
if initChannel {
ch = make(chan int, 1)
ch <- 1
}
go func(ch chan int) {
<-ch
}(ch)
c := time.Tick(1 * time.Second)
for range c {
fmt.Printf("#goroutines: %d\n", runtime.NumGoroutine())
}
}
func init() {
flag.BoolVar(&initChannel, "init", false, "initialize channel")
}
我注意到如果我用initChannelfalse 运行它,goroutines 的数量是 2:
> go run main.go
#goroutines: 2
#goroutines: 2
而如果我使用true 运行它,则数字是 1:
> go run main.go --init
#goroutines: 1
#goroutines: 1
但是,我不太明白为什么会这样。我只看到一个 go 语句,所以我希望在任何一种情况下都只有一个 goroutine。为什么从 nil 通道读取时会有两个 goroutine?
【问题讨论】:
标签: go memory-leaks channel goroutine