これが私が達成しようとしていることです。情報を得るためにサーバーにリモート呼び出しを行っていますが、情報を待つためにブロックしたいと思います。RPCが応答を受け取ると、遅延が呼び出されるように、遅延を返す関数を作成しました。次に、行くスレッドから呼び出される関数がありますthreads.blockingCallFromThread(reactor, deferredfunc, args)
。
サーバーがダウンするなど、問題が発生した場合、呼び出しのブロックが解除されることはありません。これらの場合を除いて、延期された方がいいと思います。
私は部分的に成功しました。onConnectionLost
接続が失われるとオフになる延期があります。ブロッキング呼び出し関数を次のように変更しました。
deferred = deferredfunc(args)
self.onConnectionLost.addCallback(lambda _: deferred.errback(
failure.Failure(Exception("connection lost while getting run"))))
result = threads.blockingCallFromThread(
reactor, lambda _: deferred, None)
return result
これは正常に機能します。サーバーがダウンすると、接続が失われ、エラーバックがトリガーされます。ただし、サーバーがダウンせず、すべてが正常にシャットダウンした場合onConnectionLost
でも、起動され、ここでの匿名コールバックはerrbackをトリガーしようとし、AlreadyCalled
例外が発生します。
延期されたものがすでに解雇されていることを確認するためのきちんとした方法はありますか?ブロックで包むのは避けたいのですがtry/except
、それが唯一の方法であれば、いつでもそれに頼ることができます。