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