此问题在此处已有答案:
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
我试着添加时间。在最后一个值之后睡眠,程序按预期工作
1条答案
按热度按时间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
来完成。