簡単に言うと、約 600 のネットワーク デバイスへの SSH 接続を (Paramiko モジュールを使用して) 確立し、単純なコマンドを発行して解析し、出力を返す Python スクリプトを作成しました。
スレッドを使用せずにスクリプトを実行しましたが、期待どおりに動作するので、スレッドの側面 (またはそれに対する私の理解) に問題があることがわかります。スレッディングに関する私の唯一の経験はCで...
これが私の先物の使い方です:
with futures.ThreadPoolExecutor(max_workers=10) as executor:
for x in nodeList:
futureSSH = {executor.submit(connectHost,node): node for node in x.nodes}
for future in futures.as_completed(futureSSH):
print future.running()
successes.append(futureSSH[future])
counter +=1
print counter
SSH接続を試みる関数は次のとおりです。
def connectHost(node):
myList = [],USERNAME = '#######', MY_PASSWORD = '########' ,nodeNeighbors = nodeHierarchy(),counter = 0
for i in range(10):
try:
print ("success")
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print ("Attempting connection")
ssh.connect(node,username = USERNAME,password = MY_PASSWORD, timeout = 10)
print ("Connection established")
stdin,stdout,stderr = ssh.exec_command('show cdp ne')
###Pattern match output here###
break
except Exception as error:
continue
else:
return None
これですべてが完全に機能します。153回目の繰り返しでスクリプトがフリーズしたように見え、約10分後に再開するという事実を除いて. これは、実行の残りの間、オフとオンを繰り返します。
私を困惑させているのは、SSH接続を最大10回試行するアクティブなスレッドが最大10個あり、試行ごとに10秒のタイムアウトがあることです。したがって、私の理解では、最悪の場合、単一のスレッドが終了するまで100秒間アイドル状態になるということです...そうではないので、スレッドがぶら下がったりロックしたりすることと関係がありますか?