在python中,将许多独立的、昂贵的操作分发到多个内核上

2024-06-09 15:31:05 发布

您现在位置:Python中文网/ 问答频道 /正文

如果有一个大的列表(1000+)完全独立的对象,每个对象都需要通过一些昂贵的函数来操作(每个对象大约5分钟),那么在其他核心上分配工作的最佳方式是什么?理论上,我可以将列表分成相等的部分,然后用cPickle序列化数据(需要几秒钟),然后为每个块启动一个新的python进程——如果我打算使用多台计算机的话,这可能会变成这样——但这感觉更像是一次黑客攻击。当然有一种更集成的方法来使用多处理库来实现这一点?我是不是想得太多了?在

谢谢。在


Tags: 数据对象方法函数核心列表序列化进程
2条回答

这听起来是^{}的一个很好的用例;根据您正在做什么,它可以简单到

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

这将独立地pickle列表中的每个对象。如果这是一个问题,有很多方法可以解决这个问题(尽管它们都有自己的问题,我不知道它们是否可以在Windows上运行)。因为你的计算时间相当长,这可能是无关紧要的。在

因为您要运行5分钟x1000个项目=几天/核心数量,所以您可能需要保存一些部分结果,并打印出一些进度信息。最简单的方法可能是让您调用的函数将其结果保存到文件或数据库或其他任何地方;如果这不实际,您还可以在循环中使用apply_async并在结果出现时处理它们。在

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

如果您想在一台计算机上运行作业,请使用@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

相关问题 更多 >