假设我们有一个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()
。
有没有办法避免像这样被卡住?
答案 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。