twisted perspective broker服务器端延迟

2024-10-02 14:16:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用twisted的透视代理在客户机和服务器之间进行通信。客户机从服务器请求一个远程方法“remote\u ssh”。这会导致PB服务器使用Paramiko的SSH库启动SSH连接,并从远程设备检索配置。在

这一切都很好,但是当我对几个远程设备执行此操作时,我看到了以下行为——透视代理客户机将把所有请求发送到PB服务器。然后,PB服务器将逐个执行这些请求(这很好),但是在它们全部完成之前不会返回任何结果。在

以下是相关的PB服务器端代码:

class RMethods(pb.Root):

    def remote_ssh(self, aDict):

        self.login('SSH', aDict)        # Login to remote device
        response = self.aSSH.retrieve() # Retrieve the config
        self.aSSH.close()

        return response


if __name__ == "__main__":
    reactor.listenTCP(1885, pb.PBServerFactory(RMethods()))
    reactor.run()

通过查看各种系统级信息(TCPDump和netstat),我看到了以下内容(假设远程方法调用了5次):

从PB Client到PB Server调用remote_ssh,因为这五个远程设备几乎同时发生

^{pr2}$

我不明白它为什么要等待返回结果(也就是说,为什么它要等到device5完成之后,才能返回device1的结果)。在


Tags: 方法self服务器代理客户机远程remoteresponse
1条回答
网友
1楼 · 发布于 2024-10-02 14:16:48

这是因为在反应堆有机会运行之前,无法发送响应。如果所有五个请求几乎同时到达,那么反应堆可能会唤醒一次,同时注意到所有五个请求。它将把这五个都发送到PB服务器。remote_ssh方法将为其中一个提供服务,阻塞整个时间。完成后,响应将(几乎肯定)排队。然后,remote_ssh方法将为下一个方法提供服务,并且该响应将被排队。以此类推,直到所有请求都得到处理。然后,反应堆将完成调度最初的5个事件组,并继续进行下一个事件。当它继续前进时,它会找到可以发送的数据并开始发送。在

换句话说,阻塞会阻止反应堆运行,包括阻止它发送准备好发送的输出。在

您可以尝试使用Twisted Conch作为SSH客户机,这样可以在不阻塞SSH的情况下完成SSH工作,也可以尝试将现有的SSH代码用于线程(假设可以使其成为线程安全的)或多个进程。在

相关问题 更多 >

    热门问题