Парамико Python с потоками, странная задержка - PullRequest
2 голосов
/ 26 июля 2011

Чтобы проверить существование определенного файла на многих серверах, я создал многопоточный класс, который использует paramiko для выполнения удаленной команды с использованием ssh. Результаты каждого потока вставляются в потокобезопасный 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 секунд, либо потерпят неудачу. Есть идеи, что здесь произошло?

1 Ответ

3 голосов
/ 26 июля 2011

timeout только для соединения TCP, а не для всех операций соединения.

Я ожидал бы, что __init__ будет вызван в исходном потоке - только метод run() работает в новом потоке. Так что ваше время может быть недействительным.

SSH потребовал определенного объема обработки для шифрования и настройки туннеля, поэтому, возможно, стоит посмотреть на загрузку ЦП на клиенте, чтобы узнать, является ли это вашим ограничивающим фактором для сотен соединений.

...