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