让我们说我有一个需要转换的不同长度的音乐列表或需要调整大小或类似的不同大小的图像。顺序无关紧要,因此非常适合分割多个处理器。
如果我使用multiprocessing.Pool的地图功能,似乎所有工作都提前分开,并没有考虑到某些文件可能需要更长时间来完成其他工作的事实。
如果我有12个处理器...接近处理结束时,1或2个处理器将剩余2或3个文件处理,而其他可以使用的处理器闲置。
是否有某种队列实现可以保持所有处理器加载,直到没有其他工作要做?
答案 0 :(得分:6)
multiprocessing
模块中有一个Queue
类,专门用于此目的。
编辑:如果您正在寻找一个完整的并行计算框架,该框架具有使用任务队列的map()
函数,请查看IPython的并行计算工具。特别是,您可以使用TaskClient.map()
函数来获得可用处理器的负载平衡映射。
答案 1 :(得分:2)
这对于jug来说是微不足道的:
def process_image(img):
....
images = glob('*.jpg')
for im in images:
Task(process_image, im)
现在,只需运行jug execute
几次即可生成工作进程。
答案 2 :(得分:1)
关于队列实施。有一些。
看看Celery项目。 http://celeryproject.org/
因此,在您的情况下,您可以作为Celery任务运行12次转换(每个CPU一次),添加回调函数(转换或任务),并在该回调函数中添加一个新的转换任务先前的转换已完成。
答案 3 :(得分:1)
给我带来最大乐趣的Python线程库是Parallel Python (PP)。 PP使用线程池方法和单个队列来实现您的需求是微不足道的。
答案 4 :(得分:0)
如果您使用Pool.imap_unordered
,则情况并非如此。