请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

为什么这里再开一个goroutine发送done就不会卡主呢?

为什么这里再开一个goroutine发送done就不会卡主呢?

正在回答 回答被采纳积分+3

1回答

ccmouse 2018-04-22 20:58:23

因为开一个goroutine,这里的go语句开完goroutine后会立刻返回,运行下一句语句。那么在goroutine里面发送done的时候会卡住,但是是卡在我们新开的goroutine里面,而不是main(go语言的main函数也运行在goroutine里面)里面。

当我们又运行到这里,我们会再开第二个goroutine,同样也是发送done。这样大家都不卡住。当然,代价是如果接收方慢的话会goroutine越开越多。


0 回复 有任何疑惑可以回复我~
  • 那没有time.Sleep(time.Microsecond)在main中,main不会执行完了退出呢
    回复 有任何疑惑可以回复我~ 2018-07-31 23:36:31
  • 老师,你好。这个问题我的理解是这样,麻烦你帮我看下这样理解对不对:主协程中两个循环中发送完小写和大写字符时,此时回写done标志的协程一共有20个,卡住的协程是这20个协程(小写字符的10个回写协程往chan里送的数据还没有读走,大写字符的10个回写协程又往这个chan里送数据,导致这20个回写协程都卡住了),主协程和分两次开出来(每次10个)的打印字符的协程不会卡住。卡住的20个回写状态的协程在主协程读取状态的for循环结束执行结束后结束。
    回复 有任何疑惑可以回复我~ 2020-04-21 16:06:19
  • 你说的很对!
    回复 有任何疑惑可以回复我~ 2020-04-26 20:48:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信