Python 利用多个处理器
假设我有一个很大的音乐列表,里面的音乐长度各不相同,或者有一些不同大小的图片需要调整大小,或者类似的事情。因为处理的顺序不重要,所以这非常适合分配给多个处理器来同时处理。
如果我使用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()
函数,这样可以让任务在可用的处理器之间均匀分配。