关于 [Issue 142][Why not “p.Running()<capacity”] 的问题 #143
Labels
needs investigation
This issue or proposal needs some investigations
proposal
Proposal for this repo
由于 Issue 142 Why not “p.Running()<capacity” 已经 Closed ,所以我新提交了一个 Issue 。
这个问题,我想过。我觉得目前的做法不是很优雅。我之前对这段代码进行了一些推敲,我把我的理解整理如下。
为什么要加下面这段代码呢?而且 p.lock.Unlock() 后再调用 spawnWorker(),running 个数失去了保护,这个次数就有可能超过了设定的最大值 capacity。
好吧,我们先忽略上面这个小问题。再来看下面这段代码,为什么不能在 w == nil 时,直接 spawnWorker() 个新的 worker? 因为有可能是收到广播信号,此时不能保证 p.Running() <= capacity 。
但是,我觉得可以通过修改成下面的代码解决掉这个问题
由于作者没有采用类似这样的写法,导致需要增加
if p.Running() == 0
这段代码处理广播信号。再来看广播信号,广播信号是在定时回收时,满足下面的条件触发的。
为什么需要这段代码?原因在于需要考虑这么一种情况,当 retrieveWorker() 发现 runing() 个数超过了容量,因此在 p.cond.Wait() 中。之后 runing() 的所有 worker f() 都发生了 panic,按当前的代码逻辑,是无法正常归还到工作池中的,revertWorker 不会被调用,也就是 revertWorker 不会发出 Signal 通知。因此,如果我们检测到没有1个worker running,就 Broadcast 信号。
因此广播信号的加入,确实增加了复杂度。能不能在work run() 中包装调用 f() ,处理 panic ?
The text was updated successfully, but these errors were encountered: