为了检查多个服务器上是否存在某个文件,我创建了一个线程类,用于paramiko
使用 ssh 执行远程命令。每个线程的结果都被插入到一个线程安全中,我在所有的s 完成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 秒内完成,要么失败。知道这里发生了什么吗?