私はクライアントとサーバーの間で話すためにtwistedのPerspective Brokerを使用しています。クライアントは、サーバーからリモートメソッド 'remote_ssh'を要求します。これにより、PBサーバはParamikoのSSHライブラリを使用してSSH接続を開始し、リモートデバイスから設定を取得します。twisted perspectiveブローカーサーバー側の遅延
これはうまくいきますが、これをいくつかのリモートデバイスに対して実行すると、次のような動作が発生します。パースペクティブブローカークライアントはすべての要求をPBサーバーに送信します。 PBサーバーはこれらの要求を1つずつ実行します(これは問題ありません)が、ALLが完了するまで結果のANYは返されません。ここ
関連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つの呼び出しを想定)は、次を参照:
5つのリモートデバイス用のPBクライアントからPBサーバーへコールremote_sshは、Rを返すために待って、なぜ私は理解していないのです
ほぼ同じ時間self.login device 1
self.aSSH.retrieve() device 1
self.aSSH.close() device 1
self.login device 2
self.aSSH.retrieve() device 2
self.aSSH.close() device 2
...
self.login device 5
self.aSSH.retrieve() device 5
self.aSSH.close() device 5
return results for all 5 devices
で起こりますエスカレート(すなわちdevice1の結果が返される前にdevice5が完了するまで待機するのはなぜですか?)
私は、すでにあなたが書いたことを思い出したときにConchを使用する方法の例を含めることができます:http://as.ynchrono.us/2011/03/twisted-conch-in-60-seconds.html – stderr
スレッドであっても、私はこれをどのように行うことができるのか分かりません(私は試しています)。基本的な問題は、SSH結果が戻ってくるのを待つためにブロックする必要があるということですが、メインPerspective Broker remote_methodをブロックすると、remote_methodを使って他のSSH接続の実行をすべてブロックします。 –
なぜSSHの結果が戻ってくるのを待つためにブロックする必要がありますか?別のスレッドまたはプロセスで作業を行うことによってブロックするのを避けるか、または非ブロッキングのConchクライアントAPIを使用してブロックしないようにします。 –