繁体   English   中英

Python - 如何远程并行执行进程并检索其输出

[英]Python - How to remotely execute processes in parallel and retrieve their output

我正在尝试在 Python 脚本中对未知数量的主机(可能是从一台主机到数百台主机)远程执行命令。 执行此操作的简单方法如下,但显然对于许多主机它会变得非常耗时:

listOfOutputs = []
for host in listOfHosts:
  output = subprocess.Popen(shlex.split("ssh %s '<command>'" % host), stdout = subprocess.PIPE).communicate()[0]
  listOfOutputs.append(output)

有没有办法做同样的事情,但是让命令远程并行执行,这样就不会花很长时间?

您必须在单独的线程中运行每个Popen.subprocess调用,这样您就可以在不阻塞主程序的情况下启动任意数量的程序。

我做了一个小例子,创建与主机一样多的线程。 没什么大不了的,因为线程将主要等待主机回复(否则,线程池会更好)

在我的示例中,我有 3 台主机,我对每台主机执行ping操作。 输出存储在输出的线程安全列表中并在最后打印:

import threading
import subprocess

listOfOutputs=[]

lock = threading.Lock()

def run_command(args):
    p = subprocess.Popen(["ping","-n","1",args],stdout = subprocess.PIPE)
    output,err = p.communicate()
    lock.acquire()  # listOfOutputs is thread-safe now
    listOfOutputs.append(args+": "+output)
    lock.release()

threads=[]
listOfHosts = ['host1','host2','host3']
for host in listOfHosts:
    t = threading.Thread(target=run_command,args=[host])
    t.start()          # start in background
    threads.append(t)  # store thread object for future join operation


for t in threads:
   t.join()  # wait for all threads to finish

# print results
for o in listOfOutputs:
    print(o)
    print("-"*50)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM