2011-08-19 5 views
6

私はクライアントとサーバーの間で話すために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が完了するまで待機するのはなぜですか?)

答えて

5

これは、原子炉が稼働するまで応答を送信できないためです。 5つの要求がほぼ同時に到着した場合、原子炉は一度起きて、同時に5つすべてに気付くことがあります。 PBサーバーに5つのすべてをディスパッチします。 remote_sshメソッドは、それらのうちの1つを処理し、時間全体をブロックします。それが完了すると、応答は(ほぼ確実に)キューに入れられます。次に、remote_sshメソッドが次のメソッドを処理し、その応答がキューに入れられます。そして、すべてのリクエストが処理されるまで続きます。その後、原子炉は5つのイベントの元のグループを派遣して完了し、次のものに移ります。移動すると、送信準備ができたデータが見つかって送信を開始します。

換言すれば、ブロッキングは、リアクターが動作するのを妨げます。これには、送信準備が整った出力の送信を防ぐことも含まれます。

Twisted ConchをあなたのSSHクライアントとして代わりに使うことができます。これにより、ブロックせずにSSHの作業を行うことができます。または、スレッドで既存のSSHコードを使用することもできます(スレッドセーフとする) 。

+0

私は、すでにあなたが書いたことを思い出したときにConchを使用する方法の例を含めることができます:http://as.ynchrono.us/2011/03/twisted-conch-in-60-seconds.html – stderr

+0

スレッドであっても、私はこれをどのように行うことができるのか分かりません(私は試しています)。基本的な問題は、SSH結果が戻ってくるのを待つためにブロックする必要があるということですが、メインPerspective Broker remote_methodをブロックすると、remote_methodを使って他のSSH接続の実行をすべてブロックします。 –

+0

なぜSSHの結果が戻ってくるのを待つためにブロックする必要がありますか?別のスレッドまたはプロセスで作業を行うことによってブロックするのを避けるか、または非ブロッキングのConchクライアントAPIを使用してブロックしないようにします。 –