我正在閱讀這篇博客https://medium.com/golangspec/goroutine-leak-400063aef468,并改編了以下示例,說明由于從 nil 通道接收而導(dǎo)致的 goroutine 泄漏:package mainimport ( "flag" "fmt" "runtime" "time")var initChannel boolfunc 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")}我注意到如果我用 運(yùn)行它initChannel false,goroutine 的數(shù)量是 2:> go run main.go#goroutines: 2#goroutines: 2而如果我用 運(yùn)行它true,則數(shù)字為 1:> go run main.go --init#goroutines: 1#goroutines: 1但是,我不太明白為什么會這樣。我只看到一個go語句,所以我希望在任何一種情況下都只有一個 goroutine。為什么從 nil 通道讀取時有兩個 goroutine?
1 回答

慕姐8265434
TA貢獻(xiàn)1813條經(jīng)驗 獲得超2個贊
main()
當(dāng)您的應(yīng)用程序啟動時,已經(jīng)有一個運(yùn)行該函數(shù)的 goroutine 。
如果您不初始化ch
通道,它將保持其用于通道的零值nil
。規(guī)格:接收運(yùn)算符:
從
nil
通道接收永遠(yuǎn)阻塞。
有關(guān)詳細(xì)信息,請參閱未初始化的通道如何表現(xiàn)?
所以如果 channel 是nil
,啟動的 goroutine 將永遠(yuǎn)不會結(jié)束。因此,您將擁有 2 個 goroutine:main
goroutine 和您啟動的 goroutine。
如果您使用 1 個緩沖區(qū)初始化通道并在其上發(fā)送一個值,那么您還將在“短時間內(nèi)”擁有 2 個 goroutine,但啟動的 goroutine 可以從中接收一個值然后立即結(jié)束。所以會剩下一個 goroutine,main
goroutine。
- 1 回答
- 0 關(guān)注
- 170 瀏覽
添加回答
舉報
0/150
提交
取消