亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么從 nil 通道讀取會增加 Goroutines 的數量?

為什么從 nil 通道讀取會增加 Goroutines 的數量?

Go
智慧大石 2023-08-14 17:54:01
我改編了以下示例,說明了由于從 nil 通道接收而導致的 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")}我注意到如果我用 運行它initChannel false,goroutine 的數量是 2:> go run main.go#goroutines: 2#goroutines: 2而如果我用 運行它true,數字是 1:> go run main.go --init#goroutines: 1#goroutines: 1然而,我不太明白為什么會出現這種情況。我只看到一個go語句,所以我希望在任何一種情況下都只有一個 goroutine。為什么從 nil 通道讀取時有兩個 goroutine?
查看完整描述

1 回答

?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

當你的應用程序啟動時,已經有一個 goroutine 運行該main()函數。

如果不初始化ch通道,它將保持通道的零值nil。規格: 接收運算符:

nil通道接收永遠阻塞。

因此,如果通道為nil,則啟動的 goroutine 將永遠不會結束。所以你將有 2 個 goroutine:本身的maingoroutine 和你啟動的 goroutine。

如果你用 1 個緩沖區初始化通道并在其上發送一個值,那么你也會在“一小段時間”內擁有 2 個 goroutine,但啟動的 goroutine 可以從中接收一個值,然后立即結束。所以只剩下一個 goroutine,即maingoroutine。


查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號