问题 Python利用多个处理器


让我们说我有一个很大的不同长度的音乐列表需要转换或不同大小的图像需要调整大小或类似的东西。顺序无关紧要,因此非常适合分割多个处理器。

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

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

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


6045
2018-01-29 18:47


起源



答案:


有一个 Queue 班内 multiprocessing 模块专门用于此目的。

编辑:如果您正在寻找一个完整的并行计算框架,其特点是 map() 使用任务队列的功能,看看并行计算设施 IPython的。特别是,您可以使用 TaskClient.map() 功能,以获得负载平衡映射到可用的处理器。


6
2018-01-29 18:52



我试过找一个multiprocessing.Queue的工作示例,但还没有找到一个。我在一段时间之前遇到过这种情况,并且开始测试它。即使我更改了num_processes = 2和num_jobs = 200000(因此它不会如此快速地处理),它只使用我的12个CPU中的一个 jeetworks.org/node/81  我想我会问另一个StackOverflow问题,关于在哪里找到multiprocessing.Queue的工作示例然后我会将你的标记作为答案。 - eric.frederich
队列工作正常。上面评论中的这个例子只是一个不好的例子,因为在单个进程中将工作todo整合在一起比使用多个处理器处理它所花费的时间更长。我把一些东西放在一起,几乎完全相同的Worker(multiprocessing.Process)类。 - eric.frederich


答案:


有一个 Queue 班内 multiprocessing 模块专门用于此目的。

编辑:如果您正在寻找一个完整的并行计算框架,其特点是 map() 使用任务队列的功能,看看并行计算设施 IPython的。特别是,您可以使用 TaskClient.map() 功能,以获得负载平衡映射到可用的处理器。


6
2018-01-29 18:52



我试过找一个multiprocessing.Queue的工作示例,但还没有找到一个。我在一段时间之前遇到过这种情况,并且开始测试它。即使我更改了num_processes = 2和num_jobs = 200000(因此它不会如此快速地处理),它只使用我的12个CPU中的一个 jeetworks.org/node/81  我想我会问另一个StackOverflow问题,关于在哪里找到multiprocessing.Queue的工作示例然后我会将你的标记作为答案。 - eric.frederich
队列工作正常。上面评论中的这个例子只是一个不好的例子,因为在单个进程中将工作todo整合在一起比使用多个处理器处理它所花费的时间更长。我把一些东西放在一起,几乎完全相同的Worker(multiprocessing.Process)类。 - eric.frederich


这是微不足道的 坛子

def process_image(img):
     ....
images = glob('*.jpg')
for im in images:
      Task(process_image, im)

现在,跑吧 jug execute 几次产生工作进程。


2
2018-03-14 20:10





关于队列实现。有一些。

看看Celery项目。 http://celeryproject.org/

因此,在您的情况下,您可以作为Celery任务运行12次转换(每个CPU一次),添加回调函数(转换或任务),并在该回调函数中添加一个新的转换任务,当前一个运行时转换完成。


1
2018-01-29 18:50





给我带来最大乐趣的Python线程库是 并行Python(PP)。 PP使用线程池方法和单个队列来实现您的需要是微不足道的。


1
2018-01-29 19:12





如果您使用,则情况并非如此 Pool.imap_unordered


0
2018-03-14 20:17