【发布时间】:2019-04-03 23:56:40
【问题描述】:
我有一个工人池并使用apply_async 向他们提交工作。
我不关心应用于每个项目的函数的结果。
池似乎可以接受任意数量的apply_async 调用,无论数据有多大或工作人员能够以多快的速度跟上工作。
有没有办法让apply_async 在有一定数量的项目等待处理时立即阻止?我确信在内部,池正在使用队列,所以只使用队列的最大大小是微不足道的吗?
如果这不受支持,那么提交一份大报告是否有意义,因为这看起来是非常基本的功能,而且添加起来相当琐碎?
如果一个人必须从根本上重新实现 Pool 的整个逻辑才能使其工作,那将是一种耻辱。
这是一些非常基本的代码:
from multiprocessing import Pool
dowork(item):
# process the item (for side effects, no return value needed)
pass
pool = Pool(nprocesses)
for work in getmorework():
# this should block if we already have too many work waiting!
pool.apply_async(dowork, (work,))
pool.close()
pool.join()
【问题讨论】:
-
拦截的目的是什么?也许
Pool是错误的抽象,为什么不只是Queue和一些Processes?该模块已经存在很多年了,我怀疑它会改变,它已经非常复杂了,更不用说公开阻止你的建议的许多组合了(或者它可能不会太糟糕,但它似乎并不重要我) -
唯一的目的是简单地限制可以排队给工人的工作量,而不必手动监控工人已经完成了多少工作。填充队列的进程通常可以比消耗数据快得多的速度提供数据,这可能会导致内存问题。正如我所说,队列已经具有限制大小的功能,所以添加它应该是微不足道的。
标签: python python-3.x python-multiprocessing