【发布时间】:2014-07-13 13:45:46
【问题描述】:
我有一个工作池,它提供了一个同步接口来提取结果:
func (p *Pool) Get() *Result {
for {
select {
// if there are results in channel return them
case r := <-p.results:
return r
// else check if there is any work pending we must wait for
// if not return nil to indicate that all work was done
default:
if p.active < 1 {
return nil
}
}
}
}
这个想法是,如果所有工作都完成,Get 将返回下一个工作人员结果或 nil。
现在这个实现的问题是我需要使用p.active 计数器手动跟踪所有活动的工作。这感觉有点不对劲,因为理论上信息已经在p.results 频道的长度内。
如果缓冲区为空,什么不返回任何内容的惯用方法是什么?
【问题讨论】:
-
您事先知道您将拥有多少工人吗?
-
@OneOfOne 是的,工人是固定的。
-
问题是当你请求一个结果并且你得到 nil 的那一刻,结果已经过时了。这样的设计可能容易出现竞争条件。
-
这个@FUZxxl 是什么意思?请进一步解释。
-
原子计数器确实是最有效的解决方案,其他的都太复杂了。