第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么從 nil 通道讀取會增加 Goroutine 的數(shù)量?

為什么從 nil 通道讀取會增加 Goroutine 的數(shù)量?

Go
回首憶惘然 2022-05-23 15:10:24
我正在閱讀這篇博客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:maingoroutine 和您啟動的 goroutine。

如果您使用 1 個緩沖區(qū)初始化通道并在其上發(fā)送一個值,那么您還將在“短時間內(nèi)”擁有 2 個 goroutine,但啟動的 goroutine 可以從中接收一個值然后立即結(jié)束。所以會剩下一個 goroutine,maingoroutine。


查看完整回答
反對 回復(fù) 2022-05-23
  • 1 回答
  • 0 關(guān)注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號