Python中的分布式多处理池
我有一段现有的Python代码,它在我的机器的内核之间并行运行。它完成的工作基本上是打开一个输入文件,读取内容,执行一些相当繁重的数学运算,将结果写入一个输出文件,在for循环中取下一个文件,然后再次执行。为了使多核并行,我使用了Python中的分布式多处理池,python,python-2.7,multiprocessing,distributed-computing,pathos,Python,Python 2.7,Multiprocessing,Distributed Computing,Pathos,我有一段现有的Python代码,它在我的机器的内核之间并行运行。它完成的工作基本上是打开一个输入文件,读取内容,执行一些相当繁重的数学运算,将结果写入一个输出文件,在for循环中取下一个文件,然后再次执行。为了使多核并行,我使用了多处理库中的池函数。举个简单的例子: import multiprocessing import time data = ( ['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'], ['e', '1'], ['f', '3'],
多处理
库中的池
函数。举个简单的例子:
import multiprocessing
import time
data = (
['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'],
['e', '1'], ['f', '3'], ['g', '5'], ['h', '7']
)
def mp_worker((inputs, the_time)):
print " Processs %s\tWaiting %s seconds" % (inputs, the_time)
time.sleep(int(the_time))
print " Process %s\tDONE" % inputs
def mp_handler():
p = multiprocessing.Pool(8)
p.map(mp_worker, data)
if __name__ == '__main__':
mp_handler()
这个例子只是用来展示我是如何跨8个内核实现多处理.Pool
函数的。本质上,我的代码中的mp\u worker
函数要复杂得多,但你明白我的意思
我逐渐意识到,我正在使用的网络有好几台机器99%的时间处于空闲状态。因此,我想知道是否有一种方法可以在这段代码中使用他们的核心以及我的本地核心
在伪代码中,代码可能类似于:
def mp_handler():
p = multiprocessing.Pool(servers=['local host', 192.168.0.1, 192.168.0.2], ncores=[8,8,4])
p.map(mp_worker, data)
现在,我可以将我的本地计算机和其他IP地址指定为服务器,以及我希望在每台计算机上使用的核心数
因为我网络上的其他机器都是我自己的,并且没有连接到互联网,所以为了安全起见,我不担心使用SSH
通过谷歌搜索,我注意到pathos
和spook
库可能可以帮助我解决这个问题。看起来,pathos
的命令与真正吸引我的多处理
库非常相似。然而,在这两种情况下,我都找不到一个简单的例子来说明如何将本地并行作业转换为分布式并行作业。我渴望尽可能接近多处理
库的池/映射功能
任何帮助或例子都将不胜感激 pathos中的示例与您的伪代码非常相似
from pathos.parallel import stats
from pathos.parallel import ParallelPool as Pool
pool = Pool()
def host(id):
import socket
import time
time.sleep(1.0)
return "Rank: %d -- %s" % (id, socket.gethostname())
print "Evaluate 10 items on 2 cpus"
pool.ncpus = 2
pool.servers = ('localhost:5653',)
res5 = pool.map(host, range(10))
print pool
print '\n'.join(res5)
print stats()
print ''
在上面,您可以在初始化Pool
实例时将ncpus
和servers
设置为关键字
结果如下所示:
Evaluate 10 items on 2 cpus
<pool ParallelPool(ncpus=2, servers=('localhost:5653',))>
Rank: 0 -- hilbert.local
Rank: 1 -- hilbert.local
Rank: 2 -- hilbert.local
Rank: 3 -- hilbert.local
Rank: 4 -- hilbert.local
Rank: 5 -- hilbert.local
Rank: 6 -- hilbert.local
Rank: 7 -- hilbert.local
Rank: 8 -- hilbert.local
Rank: 9 -- hilbert.local
Job execution statistics:
job count | % of all jobs | job time sum | time per job | job server
10 | 100.00 | 10.0459 | 1.004588 | local
Time elapsed since server creation 5.0402431488
0 active tasks, 2 cores
在这里,循环在接收的节点(节点)上。对于每个节点,使用ssh-f
命令启动具有指定端口(-p)、两个工作线程(-w)的ppserver
,并在30秒空闲(-t)后超时。请参阅pp
文档()。使用paths
,您只需启动ppserver
并指定端口即可工作。然后,将主机名和端口添加到第一个代码块中的服务器元组中
但是,如果您不赞成手动设置内容,pathos
会提供脚本来设置隧道
和ppserver
。使用脚本的灵活性比手动操作稍差,并且在出现问题时更难诊断……但尽管如此……请参见此处的脚本:。请查看更多内容:(1)我是pathos
的作者,(2)分布式计算相当脆弱,因此需要预先警告,在某个时候事情会失败,留下一堆乱七八糟的东西来清理,(3)您要分发的函数的成本必须高于连接到分布式集群、启动python实例和在对象上进行隧道传输的成本,(4)您必须在所有机器上安装相同版本的ppft
,否则会出错。
for i in $nodes
do
ssh -f $i /home/username/bin/ppserver.py -p $portnum -w 2 -t 30 &
done