避免由于multiprocessing.JoinableQueue队列溢出而导致的死锁

时间:2019-04-27 02:35:05

标签: python python-multiprocessing

假设我们有一个multiprocessing.Pool,其中工作线程共享一个multiprocessing.JoinableQueue,使工作项出队并可能使更多工作入队:

def worker_main(queue):
    while True:
        work = queue.get()
        for new_work in process(work):
            queue.put(new_work)
        queue.task_done()

队列满时,queue.put()将阻塞。只要至少有一个使用queue.get()从队列中读取的进程,它将释放队列中的空间以取消阻止写入程序。但是所有进程都可能同时阻塞queue.put()

有没有办法避免像这样被卡住?

1 个答案:

答案 0 :(得分:1)

取决于process(work)创建更多项目的频率,在无限大的队列旁边可能没有其他解决方案。

简而言之,您的队列必须足够大以容纳您随时可以拥有的全部工作项积压。


queue is implemented with semaphores起,可能确实有a hard size limit of SEM_VALUE_MAX其中in MacOS is 32767。因此,如果这还不够的话,您将需要对该实现进行子类化或使用put(block=False)并处理queue.Full(例如,将多余的项目放在其他地方)。

或者,看看one of the 3rd-party implementations of distributed work item queue for Python