为什么Go的频道可以关闭两次?

为什么Go的频道可以关闭两次?,第1张

为什么Go的频道可以关闭两次?

一个通道只能关闭一次,尝试关闭一个已关闭的通道紧急情况。

接收从封闭通道没有限制,从关闭信道接收:

封闭通道上的接收 *** 作始终可以立即进行,在接收到任何先前发送的值之后,得出元素类型的零值。

Go应用程序运行直到其主要goroutine运行(在“正常”情况下)为止,或者从另一个角度来看:Go应用程序在其主要goroutine终止(即

main()
函数返回)时终止。它不等待其他非
main
例程完成。

您启动了具有无限

for
循环的第二个goroutine
,无法终止。因此,该循环将继续进行,直到
main()
在并发的主goroutine中运行的函数返回为止。由于
for
循环首先从接收
jobs
,因此它将等待主goroutine将其关闭(此接收 *** 作只能继续进行)。然后,主要goroutine希望从中接收信息
done
,以便等到第二个goroutine在其上发送一个值。然后,主goroutine是“自由的”以随时终止。由于循环
jobs
已关闭,因此运行循环的第2个goroutine可能会收到一个附加值,但随后的send
on
done
会阻塞,因为不再有任何人从该接收(并且它没有缓冲)。

通常使用来完成从通道接收直到关闭的 *** 作

for range
,如果通道关闭则退出:

for j := range jobs {    fmt.Println("received: ", j)    done <- true}

当然,这将在您的情况下造成死锁,因为永远不会到达循环主体,因为没有人发送任何东西

jobs
,因此循环永远不会进入其主体以发送值,
done
而这正是主要goroutine等待的。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5476506.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存