为了账号安全,请及时绑定邮箱和手机立即绑定

为什么从 nil 通道读取会增加 Goroutine 的数量?

为什么从 nil 通道读取会增加 Goroutine 的数量?

Go
回首忆惘然 2022-05-23 15:10:24
我正在阅读这篇博客https://medium.com/golangspec/goroutine-leak-400063aef468,并改编了以下示例,说明由于从 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 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

main()当您的应用程序启动时,已经有一个运行该函数的 goroutine 。

如果您不初始化ch通道,它将保持其用于通道的零值nil规格:接收运算符:

nil通道接收永远阻塞。

有关详细信息,请参阅未初始化的通道如何表现?

所以如果 channel 是nil,启动的 goroutine 将永远不会结束。因此,您将拥有 2 个 goroutine:maingoroutine 和您启动的 goroutine。

如果您使用 1 个缓冲区初始化通道并在其上发送一个值,那么您还将在“短时间内”拥有 2 个 goroutine,但启动的 goroutine 可以从中接收一个值然后立即结束。所以会剩下一个 goroutine,maingoroutine。


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信