采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,你好。我有一个问题是这样的:在两个for循环后读取done的时候为什么没有打一个大写字符?我的理解是deadlock应该发生第一次往chan int输入大写字符时的w.done <- true的语句处,而此时应该是要输出一个大写字符后才deadlock?
老师,您好,我又看了一下,有了点自己的理解:我们在第一个写入小a的循环中给10个协程的每个channel写了一个字符,在doWork协程中取出了这10个字符并且又回写了done标志,到第二个写入大A的循环中,由于此时主协程还未拿到回写的10个done标志(拿回写done标志的代码在后面的for循环中),因此此时进入大A循环时,由于done标志还未读走,所以10个协程还未执行完上一次的作业(也即此时协程未在等待chan中数据的"初始阻塞位置"),因此导致大A循环要进入上一次未结束作业的协程中,因此导致deadlock,因此也不会执行协程中的任何语句(不会打印大写字符)。这种理解是对的不?
你开头理解的对,但是大A那段解说是不对的,并不是什么大A循环要进入上一次未结束作业的协程中。 在done <- true那一行卡住了,等着有人来接收这个true (这个你已经自己弄明白了) 同样的道理,大A写进了in,等着有人来接收这个A,但是没人接收,all goroutines are asleep - deadlock! 往管道里送东西而已,怎么能想到要进入未完成作业的协程呢?你想多了
我觉得不是这样的吧?大A写进了in,但是协程里面已经在对这个in进行遍历了,也就是说有人去接收这个A,但实际上还是报错了,是不是因为这个协程之前已经在<- done这里被阻塞了的原因呢?这个问题没想明白
你说的是对的
登录后可查看更多问答,登录/注册
语法+分布式爬虫实战 为转型工程师量身打造
3.7k 14
713 1
2.0k 1
1.1k 12