python - 多处理Python

标签 python multithreading subprocess python-multithreading python-multiprocessing

我有一台带有 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/

相关文章:

python - 模拟 Ctrl-C 到 python 脚本

python - 运行 shell 命令并捕获输出

python - 为什么 shell=True 和 shell=False 做同样的事情?

c++ - Qt 线程等待来自 GUI 的输入

c# - 在 Xamarin PCL 中获取线程信息

python - Bottlepy Hello World 应用程序不工作

python - 访问 numpy 数组中元素的属性

java - Tomcat 中运行计划任务

python - Django 表单集 - 空 kwargs

python - 使用后禁用按钮