我有一段现有的 Python 代码,它在我的机器的内核上并行运行。它完成的工作基本上是打开一个输入文件,读取内容,执行一些相当繁重的数学运算,将结果写入输出文件,在 for 循环中获取下一个文件并再次执行。为了使这个在许多内核上并行,我使用Pool
了multiprocessing
库中的函数。举个简单的例子:
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()
这个例子只是用来展示我是如何multiprocessing.Pool
跨 8 个内核实现这个功能的。本质上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 地址作为服务器以及我想在每台计算机上使用的内核数。
由于我网络上的其他机器归我所有,并且没有连接到 Internet,因此出于安全目的,我不会对使用 SSH 大惊小怪。
谷歌搜索我注意到pathos
andscoop
库可能可以帮助我解决这个问题。它看起来与真正吸引我pathos
的库具有非常相似的命令。multiprocessing
但是,在这两种情况下,我都找不到一个简单的示例来展示如何将本地并行作业转换为分布式并行作业。我渴望尽可能靠近multiprocessing
图书馆的池/地图功能。
任何帮助或示例将不胜感激!