利用多处理器的Python

利用多处理器的Python,python,multithreading,batch-file,queue,multiprocessing,Python,Multithreading,Batch File,Queue,Multiprocessing,比如说,我有一大串需要转换的不同长度的音乐,或者需要调整大小的不同大小的图像等等。顺序并不重要,因此它非常适合在多个处理器之间拆分 如果我使用multiprocessing.Pool的map函数,似乎所有的工作都是提前分配的,并且没有考虑到这样一个事实,即某些文件可能需要更长的时间来完成其他文件 如果我有12个处理器。。。接近处理结束时,1或2个处理器将有2或3个文件要处理,而其他可利用的处理器则处于空闲状态 是否有某种队列实现可以使所有处理器保持加载状态,直到没有更多的工作要做?关于队列实现。

比如说,我有一大串需要转换的不同长度的音乐,或者需要调整大小的不同大小的图像等等。顺序并不重要,因此它非常适合在多个处理器之间拆分

如果我使用multiprocessing.Pool的map函数,似乎所有的工作都是提前分配的,并且没有考虑到这样一个事实,即某些文件可能需要更长的时间来完成其他文件

如果我有12个处理器。。。接近处理结束时,1或2个处理器将有2或3个文件要处理,而其他可利用的处理器则处于空闲状态


是否有某种队列实现可以使所有处理器保持加载状态,直到没有更多的工作要做?

关于队列实现。有一些

看看芹菜项目

因此,在您的例子中,您可以运行12个转换(每个CPU上一个)作为芹菜任务,添加回调函数(到转换或任务)在该回调函数中,添加一个新的转换任务,该任务在以前的一个转换完成时运行。

多处理模块中有一个类专门用于此目的


编辑:如果您正在寻找一个完整的并行计算框架,该框架具有使用任务队列的
map()
函数,请查看的并行计算工具。特别是,您可以使用该函数获得到可用处理器的负载平衡映射。

给我带来最大乐趣的Python线程库是。对于PP来说,使用线程池方法和单个队列来实现您所需要的功能是很简单的。

这对于:


现在,只需运行几次
jug execute
即可生成工作进程。

如果使用,则情况并非如此。

我已尝试查找多处理队列的工作示例,但尚未找到。我是在不久前遇到这个问题的,我刚刚开始测试它。它只使用我12个CPU中的1个,即使我更改了num_processs=2和num_jobs=200000(这样它的处理速度就不会这么快),我想我会问另一个StackOverflow问题,关于在哪里可以找到多处理的工作示例。排队,然后我会将您的标记为答案。排队工作正常。上面评论中的那个例子只是一个糟糕的例子,因为在一个进程中把要做的工作放在一起比使用多个处理器处理要花更长的时间。我将一些东西与一个几乎相同的Worker(multiprocessing.Process)类结合在一起,这个类工作得很好。
def process_image(img):
     ....
images = glob('*.jpg')
for im in images:
      Task(process_image, im)