Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 告诉多个生产商的消费者没有更多的结果_Python_Multiprocessing - Fatal编程技术网

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()