2016-09-09 12 views
0

Pythonスクリプトで不明な数のホスト(1つのホストから何百にもなる可能性があります)に対してリモートでコマンドを実行しようとしています。これを行う簡単な方法は次の通りであるが、明らかにそれは途方もなく多くのホストで時間がかかり得ることができます。 Python - リモートでプロセスを並行して実行し、出力を取得する方法

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

は、これと同じことを行うための方法はありますが、コマンドはリモートでて並列に実行する必要があり長い時間がかかりませんか?

答えて

0

メインプログラムをブロックせずに、できるだけ多くを起動できるように、別のスレッドでそれぞれ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 


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

# print results 
for o in listOfOutputs: 
    print(o) 
    print("-"*50) 
関連する問題