我正在使用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的结果)。在
这是因为在反应堆有机会运行之前,无法发送响应。如果所有五个请求几乎同时到达,那么反应堆可能会唤醒一次,同时注意到所有五个请求。它将把这五个都发送到PB服务器。
remote_ssh
方法将为其中一个提供服务,阻塞整个时间。完成后,响应将(几乎肯定)排队。然后,remote_ssh
方法将为下一个方法提供服务,并且该响应将被排队。以此类推,直到所有请求都得到处理。然后,反应堆将完成调度最初的5个事件组,并继续进行下一个事件。当它继续前进时,它会找到可以发送的数据并开始发送。在换句话说,阻塞会阻止反应堆运行,包括阻止它发送准备好发送的输出。在
您可以尝试使用Twisted Conch作为SSH客户机,这样可以在不阻塞SSH的情况下完成SSH工作,也可以尝试将现有的SSH代码用于线程(假设可以使其成为线程安全的)或多个进程。在
相关问题 更多 >
编程相关推荐