采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
同学理解的很对。的确是圈出的这几句的确是这样循环等待的关系,里面也考虑了requet的数量。值得提出的是,这个问题通常是无法通过增加worker的数量来解决的,只能暂时缓解。
谢谢老师
借用同学的图问一下,实际上是主routine卡在了6这个位置导致了result被接收,造成了循环等待了吗?问题的关键是不是因为接收和发送都在一个goruntine里面,导致如果只要接收和发送其中一个卡住就会导致循环等待?
这是一个基本的死锁问题。虽然这里没有用到锁,但原理一样。 死锁的四个必要条件 1、互斥条件:一个资源每次只能被一个进程使用; 2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放; 3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺; 4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系; 互斥和不剥夺一般无法破除。循环等待正如图上已经形成。另一方面收发在一个goroutine里实际上造成了请求保持,就是您所说的。后面改成select也是主要对请求保持进行破解
举个例子:
以前是大家排队上厕所,排队的人把门都堵了,人家上完厕所想出来出不来,然后大家也进不去。现在每个人都在两边站着(这就是并发),排队的路没人堵了,人家能出来,大家才能进去嘛。
你要是有钱,也能开一排厕所(开n个worker),来了都有厕所上,也不会出现堵门的情况了。
这个解释比我的好多了
确实这里的逻辑非常绕。。
登录后可查看更多问答,登录/注册
语法+分布式爬虫实战 为转型工程师量身打造
3.7k 14
713 1
2.0k 1
1.1k 12