在python中通过多个内核分发许多独立,昂贵的操作

时间:2013-02-06 07:07:09

标签: python multiprocessing

给定一个完全独立的对象的大型列表(1,000+),每个对象需要通过一些昂贵的功能(每个约5分钟)进行操作,最好的是什么将工作分配到其他核心的方法?从理论上讲,我可以将列表分成相等的部分并使用cPickle序列化数据(需要几秒钟)并为每个块启动一个新的python进程 - 如果我打算使用多台计算机,它可能会出现这种情况 - 但这感觉更像是黑客而不是任何东西。当然,使用多处理库有一种更集成的方法可以做到这一点吗?我是在想这个吗?

感谢。

2 个答案:

答案 0 :(得分:4)

这听起来像multiprocessing.Pool的一个很好的用例;取决于你正在做什么,它可以像

一样简单
pool = multiprocessing.Pool(num_procs)
results = pool.map(the_function, list_of_objects)
pool.close()

这将独立地挑选列表中的每个对象。如果这是一个问题,有各种方法可以解决这个问题(虽然所有问题都解决了,我不知道它们是否适用于Windows)。由于你的计算时间相当长,可能无关紧要。

由于您运行5分钟x 1000项=几天/核心数,您可能希望在此过程中保存部分结果并打印出一些进度信息。最简单的方法就是让你调用的函数将结果保存到文件或数据库或其他任何东西;如果这不实用,你也可以在循环中使用apply_async并在结果出来时处理结果。

您还可以查看joblib之类的内容来为您处理此问题;我对它不是很熟悉,但似乎它正在接近同样的问题。

答案 1 :(得分:1)

如果您想在一台计算机上运行该作业,请在答案中使用@Dougal建议的multiprocessing.Pool()

如果您希望让多台计算机解决此问题,Python也可以这样做。我在谷歌搜索“python并行处理”,发现了这个:

Parallel Processing in python

其中一个答案推荐“mincemeat”,一个377行Python源文件中的map / reduce解决方案!

https://github.com/michaelfairley/mincemeatpy

我敢打赌,如果你想在多台计算机上使用多个核心,只需要做一些工作,你就可以使用multiprocessing.Pool()来启动一组mincemeat客户端。

编辑:我今晚做了更多的研究,看起来芹菜将是一个不错的选择。芹菜每台机器已经有多个工人。

http://www.celeryproject.org/

这里推荐芹菜:

https://stackoverflow.com/questions/8232194/pros-and-cons-of-celery-vs-disco-vs-hadoop-vs-other-distributed-computing-packag