Python的paramiko有线程,奇怪的延迟

时间:2011-07-26 11:10:49

标签: python multithreading paramiko

为了检查许多服务器上是否存在某个文件,我创建了一个使用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 个答案:

答案 0 :(得分:3)

timeout仅用于TCP连接,而不是连接上的整个操作。

我希望在原始线程上调用__init__ - 只有run()方法在新线程上运行。所以你的时间可能无效。

SSH涉及隧道加密和设置的一定数量的处理,因此可能值得查看客户端上的CPU使用情况,看看这是否是100个连接的限制因素。