2011-07-26 7 views
2

多くのサーバー上の特定のファイルの存在を確認するために、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秒で終了するか、失敗すると思われます。どのようなアイデアがここに起こった?

答えて

3

timeoutはTCP接続用であり、接続上の操作全体ではありません。

私は、元のスレッドで__init__が呼び出されることを期待しています - run()メソッドだけが新しいスレッドで実行されます。あなたの時間は無効かもしれません。

SSHには、トンネルの暗号化と設定に一定の処理が含まれていたため、クライアントのCPU使用率を見て、それが接続数100の制限要因であるかどうかを調べる価値があります。

+0

ありがとうございます!驚いたことに、それは確かにCPU負荷の問題でした..私はスレッドプールを使用します。 –

関連する問題