3

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

谢谢。

4

2 回答 2

5

这听起来像是 a 的一个很好的用例multiprocessing.Pool;取决于你在做什么,它可能很简单

pool = multiprocessing.Pool(num_procs)
results = pool.map(the_function, list_of_objects)
pool.close()

这将独立腌制列表中的每个对象。如果这是一个问题,有多种方法可以解决这个问题(尽管它们都有自己的问题,我不知道它们中的任何一个是否适用于 Windows)。由于您的计算时间相当长,这可能无关紧要。

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

您也可以研究类似joblib的东西来为您处理这个问题;我对它不是很熟悉,但似乎它正在接近同样的问题。

于 2013-02-06T07:16:54.673 回答
1

如果您想在单台计算机上运行该作业,multiprocessing.Pool()请按照@Dougal 在他的回答中的建议使用。

如果你想让多台计算机解决这个问题,Python 也可以做到。我在 Google 上搜索了“python 并行处理”并找到了这个:

python中的并行处理

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

https://github.com/michaelfairley/mincemeatpy

我敢打赌,multiprocessing.Pool()如果您想在多台计算机上使用多个内核,您可以通过一些工作来启动一组 mincemeat 客户端。

编辑:今晚我做了更多的研究,看起来 Celery 是一个不错的选择。Celery 已经在每台机器上运行多个工人。

http://www.celeryproject.org/

这里推荐芹菜:

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

于 2013-02-06T07:48:06.123 回答