采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师这里的node一直送数据,没有人收,为什么放到go func(){}就不会deadlock,单独就会出现deadlock呢?
非常抱歉可能当时那两天正好忙了一下没看到,然后问题有了回答以后,反而不出现在待解答里面了。
这里呢,首先假设我们收到返回值的人会从out里面不断收数据。但是如果不使用go func的话,out<-node这行就会等人收,但此时函数还没有返回,外面从out收数据的代码还没执行到,形成了死锁。
那么这里有了go func。go func这一大段只是开了一个goroutine“并行”执行,而TraverseWithChannel立刻返回,那么外面收数据的代码就被执行到,这个channel的路就通了。
老师你好,如果不加go func 会死锁,这个我可以理解到,我有点不懂的是,如果加了go func 那么主函数就通了,我看了一下这里没有close就会死锁,这是为什么呢?如果我没有接受者,这个go func 里面会不会有人送这个chan呢?如果有人送,它没有人收会不会deadlock呢? 最后一问,协程如果被阻塞会不会出现deadlock,多谢老师
您似乎对死锁的概念有误。如果不加go fun,这个是死锁。在这种情况下,发的人发不出去在等人收,收的人收不到在等人发,这种互相等待却解不了的情况,才是死锁。 那么我们看主函数通了,但是没有close。goroutine现在的状态不是死锁,是阻塞,在等待别人收数据。虽然再也没有人去收数据,但此时主函数一直在运行,如果主函数想收数据,随时都可以。这个和上面的死锁解不开是不一样的。 嗯,所以就是说阻塞不要紧,是正常的,只要有channel就总有一方要阻塞。要互相把对方阻塞住才是死锁,死锁由于解不开,是要避免的。
回复 ccmouse好的 ,多谢老师,!!!
老师 在嘛 马上一周了 囧
老师看到以后 ,可以回答一下嘛 多谢
登录后可查看更多问答,登录/注册
语法+分布式爬虫实战 为转型工程师量身打造
3.7k 14
713 1
2.0k 1
1.1k 12