2

多くのサーバーで特定のファイルの存在を確認するために、paramikosshを使用してリモートコマンドを実行するために使用するスレッドクラスを作成しました。各スレッドの結果はスレッドセーフに挿入され、Queue.Queueすべての処理が完了した後でその内容を読み取りますjoin()。これはスレッドの主要部分です:

client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect(self.server, username='linqmap', timeout=5)
stdin, stdout, stderr = client.exec_command('my_command')

このソリューションはうまく機能しますが、私の注意を引いた奇妙な動作があります。スレッドはその__init__時間を記録します:

def __init__(self, server, queue, lock):
    ...
    self.start_time=datetime.datetime.now()
    ...

そして、その終了時間(結果がキューに挿入された時間):

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秒で終了するか、失敗すると推測しました。ここで何が起こったのか分かりますか?

4

1 に答える 1

3

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

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

SSHは、トンネルの暗号化とセットアップに一定量の処理を伴うため、クライアントのCPU使用率を調べて、それが数百の接続の制限要因であるかどうかを確認する価値がある場合があります。

于 2011-07-26T12:43:44.590 に答える