为什么main()goroutine在添加最后一个值后没有阻塞?

n9vozmp4  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(72)

此问题在此处已有答案

What happens to unfinished goroutines when the main/parent goroutine exits or returns?(1个答案)
20天前关闭。
我有个准则

package main

import (
    "fmt"
)

func squares(c chan int) {
    for i := 0; i < 4; i++ {
        num := <-c
        fmt.Println(num * num)
    }
}

func main() {
    fmt.Println("main() started")
    c := make(chan int)

    go squares(c)

    c <- 1
    c <- 2
    c <- 3
    c <- 3
    fmt.Println("main() stopped")
}

字符串
答案是:main()started 1 4 9 main()stopped
你能解释一下,为什么主goroutine在最后一个值之后没有阻塞,而我有无缓冲通道。我在等待这个答案:1,4,4,9
我试着添加时间。在最后一个值之后睡眠,程序按预期工作

yptwkmov

yptwkmov1#

go squares(c)行之后,有两个并发运行的goroutine:
1.主goroutine(main()中的代码)
1.第二个goroutine(squares()中的代码
每个通道发送操作(例如c <- 1)都会在goroutine之间引起同步。但是在最后一个发送操作之后,就没有更多的同步了。两个goroutine独立运行,尽管不会持续很长时间。
如果主goroutine中的fmt.Println("main() stopped")行恰好在第二个goroutine中的fmt.Println(num * num)行之前运行(就像你的例子一样),那么main()函数返回,导致两个goroutine都退出。
为了确保第二个goroutine完成它的工作,主goroutine需要等待它。这可以使用另一个通道或WaitGroup来完成。

相关问题