Python 利用多个处理器

11 投票
5 回答
2489 浏览
提问于 2025-04-16 10:51

假设我有一个很大的音乐列表,里面的音乐长度各不相同,或者有一些不同大小的图片需要调整大小,或者类似的事情。因为处理的顺序不重要,所以这非常适合分配给多个处理器来同时处理。

如果我使用multiprocessing.Pool的map函数,似乎所有的工作都是提前分配好的,这并没有考虑到有些文件处理起来可能会比其他文件花更多时间。

结果就是,如果我有12个处理器,在处理快结束的时候,可能会有1到2个处理器还剩下2到3个文件没处理,而其他本可以利用的处理器却闲着。

有没有什么队列的实现方法,可以让所有处理器都保持忙碌,直到没有工作可做为止?

5 个回答

1

关于队列的实现方式,有很多种。

可以看看Celery这个项目。 http://celeryproject.org/

在你的情况下,你可以同时运行12个转换任务(每个CPU一个),把这些转换当作Celery的任务来处理。你还可以添加一个回调函数(可以是针对转换的,也可以是针对任务的),在这个回调函数里,当其中一个转换完成后,就再添加一个新的转换任务来运行。

2

jug来做这个事情非常简单:

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

现在,只需运行 jug execute 几次,就可以启动工作进程了。

6

multiprocessing 模块里,有一个叫 Queue 的类,专门用来处理这个问题。

补充一下:如果你想要一个完整的并行计算框架,并且这个框架里有一个使用任务队列的 map() 函数,可以看看 IPython 的并行计算功能。特别是,你可以使用 TaskClient.map() 函数,这样可以让任务在可用的处理器之间均匀分配。

撰写回答