Python 告诉多个生产商的消费者没有更多的结果
我有一些代码,将工作添加到一个队列中,由多个工作人员处理,然后将结果放入另一个队列中,由最后一个工作人员处理。当我有多个生产商将材料添加到此结果队列时,我如何可靠地向Python 告诉多个生产商的消费者没有更多的结果,python,multiprocessing,Python,Multiprocessing,我有一些代码,将工作添加到一个队列中,由多个工作人员处理,然后将结果放入另一个队列中,由最后一个工作人员处理。当我有多个生产商将材料添加到此结果队列时,我如何可靠地向收集器流程发出信号,表示没有更多要处理的内容 import multiprocessing import time J = multiprocessing.Queue() R = multiprocessing.Queue() def intermediate_worker(jobs, results): while T
收集器
流程发出信号,表示没有更多要处理的内容
import multiprocessing
import time
J = multiprocessing.Queue()
R = multiprocessing.Queue()
def intermediate_worker(jobs, results):
while True:
task = jobs.get()
if task is None:
jobs.put(None)
break
print 'working', task
results.put(task)
def collector(result_queue) :
total = 0
while True :
result = result_queue.get()
total += result
print 'collection', total
[multiprocessing.Process(target=intermediate_worker, args=(J,R)).start()
for i in xrange(2)]
multiprocessing.Process(target=collector, args=(R,)).start()
for chunk_dummy in xrange(10) :
J.put(chunk)
J.put(None)
有几种方法。一种是寻找n种毒药,其中n是你拥有的生产商数量。您已经熟悉了这种方法,因为您正在使用它关闭生产商。这可以,但有点笨拙-你需要在你的消费者中有额外的逻辑来跟踪你看到了多少毒丸 我个人最喜欢的是用a为我计数。如果我们知道有多少生产商处于活动状态,这就足以确定何时关闭消费者-我们在
(没有生产商处于活动状态)
和(队列为空)
时将其关闭
J=multiprocessing.Queue()
R=多处理。队列()
S=多处理。信号量(NUMWORKERS)
def中级工人(工作、结果、sem):
使用sem:#上下文管理器处理信号量的递增/递减
尽管如此:
task=jobs.get()
如果任务为无:
jobs.put(无)
打破
打印“正在工作”,任务
结果.放置(任务)
def收集器(结果队列,sem):
总数=0
而sem.get_value()
粗略的代码,完全未经测试,但应该能够理解要点
J = multiprocessing.Queue()
R = multiprocessing.Queue()
S = multiprocessing.Semaphore(NUMWORKERS)
def intermediate_worker(jobs, results, sem):
with sem: #context manager handles incrementing/decrementing the semaphore
while True:
task = jobs.get()
if task is None:
jobs.put(None)
break
print 'working', task
results.put(task)
def collector(result_queue, sem) :
total = 0
while sem.get_value() < NUMWORKERS or not result_queue.empty():
result = result_queue.get()
total += result
print 'collection', total
[multiprocessing.Process(target=intermediate_worker, args=(J,R,S)).start()
for i in xrange(NUMWORKERS)]
multiprocessing.Process(target=collector, args=(R,S)).start()