Python使用multiprocessing pool.map进行分布式计算

1 投票
2 回答
678 浏览
提问于 2025-04-18 04:34

下面的代码可以让“someprogram”这个程序同时处理50个输入文件,使用5个工作线程。那怎么做到在这台电脑上用5个工作线程,而在另一台电脑上用7个工作线程呢?这只用到了像multiprocessing这样的标准库。理想情况下,我希望有一个包含元组的列表(比如(主机名,工作线程数量)),这样可以加快某些操作,甚至可以把它做成一个装饰器,这样在像“commandlinestuff”这样的函数上就能更方便地重复使用了。(使用的是Linux和Python 2.7)

import multiprocessing
import subprocess

def commandlinestuff(inputfilename):
    p = subprocess.Popen("someprogram "+inputfilename, shell=True)
    p.wait()

inputfilenames = ["something"+str(i).zfill(2)+".in" for i in range(50)]
p = multiprocessing.pool(5)
p.map(commandlinestuff, inputfilenames)

2 个回答

0

听起来你想要重新发明一个叫做 pyro 的东西。这个东西是用纯Python写的,但现在并不是Python标准库的一部分。

简单来说,你需要在远程机器上运行一个服务器,这个服务器可以接受连接,接收一个被“腌制”的对象(也就是经过处理的数据)来执行(可能还会有一些其他数据),然后执行这个对象并把结果返回给你。你还需要在本地机器上有一个客户端,它负责发送请求,收集结果,可能还要进行一些负载均衡。

Python wiki 的并行处理部分,有很多工具可以用来做这些事情,每种工具都有自己的优缺点。

0

这个链接 https://code.google.com/p/distributed-python-for-scripting/ 对我来说非常有效——不需要安装任何东西,而且看起来是用Python进行多进程处理最简单、最快捷的方法。

撰写回答