Python的paramiko与线程,奇怪的延迟
为了检查多个服务器上某个文件是否存在,我创建了一个多线程的类,使用paramiko
通过ssh执行远程命令。每个线程的结果会被放入一个线程安全的Queue.Queue
中,我在所有线程完成后读取这个队列的内容。这是线程的主要部分:
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()
...
还有它的完成时间(也就是结果被放入队列的时间):
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
timeout
只是针对 TCP 连接的时间限制,并不是针对整个连接过程的。
我认为 __init__
方法应该是在原来的线程中被调用的,只有 run()
方法是在新线程中运行。所以你的时间可能不太准确。
SSH 需要进行一定的处理,比如加密和建立连接,这可能会影响性能。因此,建议你查看一下客户端的 CPU 使用情况,看看这是否是你在处理数百个连接时的瓶颈。