【问题标题】:Python's paramiko with threading, strange delay带有线程的Python paramiko,奇怪的延迟
【发布时间】:2011-07-26 11:10:49
【问题描述】:

为了检查多个服务器上某个文件是否存在,我创建了一个线程类,它使用paramiko 来使用 ssh 执行远程命令。每个线程的结果被插入到一个线程安全的Queue.Queue 中,我在所有join()s 完成后读取它的内容。这是线程的主要部分:

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 秒内完成,要么失败。知道这里发生了什么吗?

【问题讨论】:

    标签: python multithreading paramiko


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!令人惊讶的是,这确实是 CPU 负载问题。我将使用线程池。
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 2014-07-31
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多