多くのサーバー上の特定のファイルの存在を確認するために、paramiko
を使用してsshを使用してリモートコマンドを実行するスレッドクラスを作成しました。各スレッドの結果はスレッドセーフQueue.Queue
に挿入され、join()
がすべて実行された後にその内容が読み込まれます。これはスレッドの主要部分です:スレッド、奇妙な遅延を伴うPythonのparamiko
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect(self.server, username='linqmap', timeout=5)
stdin, stdout, stderr = client.exec_command('my_command')
このソリューションは素晴らしいですが、私の注意を引いた奇妙な動作があります。
def __init__(self, server, queue, lock):
...
self.start_time=datetime.datetime.now()
...
そして、その終了時間(結果はキューに挿入した時):スレッドがその__init__
時間を記録します
def _report(self, message, status):
duration=datetime.datetime.now()-self.start_time
...
self.queue.put((self.server, duration, message, status))
問題は、期間はすべてのために非常に似ているということですスレッド。少数(〜5)のスレッドの場合、約3秒です。大きい数字(〜100)の場合、約30秒です。
接続にタイムアウトが5秒あるので、すべてのスレッドが5秒で終了するか、失敗すると思われます。どのようなアイデアがここに起こった?
ありがとうございます!驚いたことに、それは確かにCPU負荷の問題でした..私はスレッドプールを使用します。 –