Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于分布式集群的Python多处理_Python_Multiprocessing_Distributed Computing - Fatal编程技术网

基于分布式集群的Python多处理

基于分布式集群的Python多处理,python,multiprocessing,distributed-computing,Python,Multiprocessing,Distributed Computing,我正在寻找一个python包,它不仅可以在一台计算机内的不同内核之间进行多处理,还可以在多台计算机上分布一个集群。分布式计算有很多不同的python包,但大多数似乎需要更改代码才能运行(例如,一个前缀指示对象位于远程计算机上)。具体地说,我想要一些尽可能接近多处理pool.map函数的东西。因此,例如,如果在一台机器上,脚本是: from multiprocessing import Pool pool = Pool(processes = 8) resultlist = pool.map(fu

我正在寻找一个python包,它不仅可以在一台计算机内的不同内核之间进行多处理,还可以在多台计算机上分布一个集群。分布式计算有很多不同的python包,但大多数似乎需要更改代码才能运行(例如,一个前缀指示对象位于远程计算机上)。具体地说,我想要一些尽可能接近多处理
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)

如果你想要一个非常简单的解决方案,没有一个

但是,有一种解决方案具有
多处理
接口--
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)

这有点挑剔,要让远程服务器工作,必须事先在指定的端口启动运行在
remote.computer.com
上的服务器,并且必须确保本地主机和远程主机上的设置都允许直接连接或ssh隧道连接。另外,您需要在每个主机上运行相同版本的
paths
paths
分支
pp
。另外,对于ssh,您需要运行ssh代理以允许使用ssh进行无密码登录

但是,如果您的功能代码可以通过
dill.source.importable
传输到远程主机,那么希望一切都能正常工作


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

到这里的聚会有点晚,但因为我也在寻找类似的解决方案,而且这个问题仍然没有被标记为已回答,我想我会贡献我的发现

我最终使用了。它提供了一个并行映射实现,可以跨多个核心、跨多个主机工作。如果在调用过程中需要,它还可以返回Python的串行
map
函数

在独家新闻的介绍页面中,它引用了以下功能:

独家新闻与未来、多处理和 类似模块如下所示:

  • 通过网络控制多台计算机的电源
  • 能够在一个任务中产生多个任务
  • API兼容
  • 并行化串行代码,只需稍加修改
  • 高效的负载平衡
它确实有一些怪癖(函数/类必须是可pickle的),如果它们不共享相同的文件系统模式,那么在多个主机上顺利运行的设置可能会很繁琐,但总体而言,我对结果非常满意。就我们的目的而言,做了相当多的Numpy&Cython,它提供了出色的性能

希望这有帮助

你看了吗

特点:

  • 映射/约简范式
  • Python编程
  • 分布式共享磁盘
  • ssh底层传输
  • web和控制台界面
  • 易于添加/阻止/删除节点
  • 主启动从属节点,无需用户干预
  • 如果出现故障,从属节点将自动重新启动
  • 很好的文档。之后,我能够在几分钟内启动一个2机集群(我唯一需要做的就是创建$DISCO_HOME/root文件夹,以便连接到WebUI,我想这是由于日志文件创建错误)
disco文档中的一个简单示例:

from disco.core import Job, result_iterator

def map(line, params):
    for word in line.split():
        yield word, 1

def reduce(iter, params):
    from disco.util import kvgroup
    for word, counts in kvgroup(sorted(iter)):
        yield word, sum(counts)

if __name__ == '__main__':
    job = Job().run(input=["http://discoproject.org/media/text/chekhov.txt"],
                    map=map,
                    reduce=reduce)
    for word, count in result_iterator(job.wait(show=True)):
        print(word, count)

我建议看一看,它的目的就是要做到这一点

Ray在单机多核设置中使用与在分布式设置中相同的语法来并行化代码。如果您愿意使用for循环而不是map调用,那么您的示例如下所示

导入光线
导入时间
ray.init()
@雷,遥控器
def功能(x):
睡眠时间(0.1)
返回x
arglist=[1,2,3,4]
结果_id=[arglist中x的function.remote(x)]
resultlist=ray.get(结果\u id)
这将使用本地拥有的多个内核并行运行四个任务。要在集群上运行相同的示例,唯一需要更改的行是调用
ray.init()
。可以找到相关文档


请注意,我正在帮助开发。

可能需要比您所期望的更多的设置,但您可以查看芹菜的分布式任务队列。我想检查一下,我可能最终会使用芹菜,但它需要大量的设置,并且帮助文件很难遵循(不连贯,而不是在最后一个完整脚本的副本中一步一步清晰的说明)。Jug的文档谈到了并行化,但是不能跨不同的计算机进行并行。还有一个相当全面的解决方案列表:还值得注意的是,有一个与
pathos
类似的最新解决方案——一个名为
dask
的包。我应该提到我是
pathos
的作者。我强烈建议您创建一个详细的设置从头到尾指导,以便在服务器上运行server.py文件和客户端上运行client.py文件后,客户端可以实际访问服务器并在客户端和服务器上运行作业池。在阅读了这个答案和你对我的另一个问题的回答后,我仍然不确定如何(a)设置服务器或(b)建立与服务器的安全连接。我不知道如何做(a)。设置服务器是否仅仅意味着如果SSH
from disco.core import Job, result_iterator

def map(line, params):
    for word in line.split():
        yield word, 1

def reduce(iter, params):
    from disco.util import kvgroup
    for word, counts in kvgroup(sorted(iter)):
        yield word, sum(counts)

if __name__ == '__main__':
    job = Job().run(input=["http://discoproject.org/media/text/chekhov.txt"],
                    map=map,
                    reduce=reduce)
    for word, count in result_iterator(job.wait(show=True)):
        print(word, count)