分布式集群的 Python 多处理

新手上路,请多包涵

我正在寻找一个 python 包,它不仅可以在一台计算机的不同内核上进行多处理,而且还可以在分布在多台机器上的集群中进行多处理。有许多用于分布式计算的不同 python 包,但大多数似乎都需要更改代码才能运行(例如,表示对象位于远程机器上的前缀)。具体来说,我想要尽可能接近 multiprocessing pool.map 功能的东西。因此,例如,如果在一台机器上,脚本是:

 from multiprocessing import Pool
pool = Pool(processes = 8)
resultlist = pool.map(function, arglist)

那么分布式集群的伪代码将是:

 from distprocess import Connect, Pool, Cluster

pool1 = Pool(processes = 8)
c = Connect(ipaddress)
pool2 = c.Pool(processes = 4)
cluster = Cluster([pool1, pool2])
resultlist = cluster.map(function, arglist)

原文由 Michael 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 369
1 个回答

如果您想要一个非常简单的解决方案,那么没有。

但是,有一个解决方案具有 multiprocessing 接口 pathos 能够通过并行映射建立到远程服务器的连接,并进行多处理。

如果你想要一个 ssh 隧道连接,你可以这样做……或者如果你可以使用不太安全的方法,你也可以这样做。

 >>> # establish a ssh tunnel
>>> from pathos.core import connect
>>> tunnel = connect('remote.computer.com', port=1234)
>>> tunnel
Tunnel('-q -N -L55774:remote.computer.com:1234 remote.computer.com')
>>> tunnel._lport
55774
>>> tunnel._rport
1234
>>>
>>> # define some function to run in parallel
>>> def sleepy_squared(x):
...   from time import sleep
...   sleep(1.0)
...   return x**2
...
>>> # build a pool of servers and execute the parallel map
>>> from pathos.pp import ParallelPythonPool as Pool
>>> p = Pool(8, servers=('localhost:55774',))
>>> p.servers
('localhost:55774',)
>>> y = p.map(sleepy_squared, x)
>>> y
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

或者,您可以配置直接连接(无 ssh)

 >>> p = Pool(8, servers=('remote.computer.com:5678',))
# use an asynchronous parallel map
>>> res = p.amap(sleepy_squared, x)
>>> res.get()
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

这有点挑剔,要使远程服务器正常工作,您必须预先在指定端口启动运行在 remote.computer.com 上的服务器——并且您必须确保本地主机和远程主机将允许直接连接或 ssh 隧道连接。另外,你需要有相同版本的 pathospathos fork of pp 在每台主机上运行。此外,对于 ssh,您需要运行 ssh-agent 以允许使用 ssh 进行无密码登录。

但是,希望一切正常……如果您的函数代码可以使用 dill.source.importable 传输到远程主机。

仅供参考, pathos 早就应该发布了,基本上,在剪切新的稳定版本之前需要解决一些错误和界面更改。

原文由 Mike McKerns 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题