【发布时间】:2016-07-10 02:30:16
【问题描述】:
我有一段现有的 Python 代码在我的机器的内核上并行运行。它完成的工作基本上是打开一个输入文件,读取内容,执行一些相当繁重的数学运算,将结果写入输出文件,在 for 循环中获取下一个文件并再次执行。为了在多个内核上实现并行,我使用了multiprocessing 库中的Pool 函数。举个简单的例子:
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 个内核上实现 multiprocessing.Pool 函数的。本质上,我的代码中的 mp_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 和scoop 库可能可以帮助我解决这个问题。看起来pathos 的命令与multiprocessing 库非常相似,这对我很有吸引力。但是,在这两种情况下,我都找不到一个简单的示例来展示如何将本地并行作业转换为分布式并行作业。我渴望尽可能接近multiprocessing 库的池/地图功能。
任何帮助或示例将不胜感激!
【问题讨论】:
标签: python python-2.7 multiprocessing distributed-computing pathos