我有一台带有 4 个 cpu 的 Linux 机器。
我有一个长时间运行的程序,需要在 1024 个主机上同时执行并获取结果。
ipArrayList -> Contains list of host ips.
下面的程序运行良好,但需要很长时间,有时会挂起几天:
import multiprocessing
pool = multiprocessing.Pool(100)
pool.map(long_running_module,ipArrayList)
pool.close()
pool.join()
只有在输入较少(ipArrayList 的大小)的情况下,以下程序才能运行得更快。如果 ipArray 列表中的 IP 数量很大,有时我会遇到缓冲区空间问题。([Errno 105] 无可用缓冲区空间)
job = []
for ip in ipArrayList:
p = multiprocessing.Process(target=long_running_module, args=(ip))
job.append(p)
p.start()
for j in job:
j.join()
long_run_module 通过 ssh(paramiko) 连接到 ipArrayList 中的每个 ip。它在主机内部进行一些长时间运行的计算,然后将结果返回到同步列表。
请帮助我有效地解决这个问题。
最佳答案
我同意,如果你只有 4 个核心,使用池并不是最好的,你可以使用“map”函数代替,看看this .
map(f, S)
f 是一个接受一个参数并返回一个值的函数。
S 是任何可迭代的。
>>> def add100(x):
... return x+100
...
>>> map(add100, (44,22,66))
[144, 122, 166]
但是,由于您需要在 1024 个主机上同时执行并获取结果,因此我强烈建议您使用分布式平台。 Python 中有一些,但是 SCOOP有很好的记录和维护。
关于python - 多处理Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35475384/