次の問題があります。
私はトルネード ベースのアプリケーション サーバーで作業しています。ほとんどのコードは同期可能であり、Web インターフェースは Tornado の非同期機能をまったく使用していません。
tornado.iostream
コマンドを送信するためにインターフェイスを使用する (非同期) レガシー バックエンドにインターフェイスする必要があります。これらのコマンドへの応答は、ステータス更新などの他の定期的な情報とともに非同期で送信されます。
コードは、他のバックエンドにも使用される共通のインターフェイスにラップされています。
私が達成したいことは次のとおりです。
# this is executed on initialization
self.stream.read_until_close(self.close, self.read_from_backend)
# this is called whenever data arrives on the input stream
def read_from_backend(self, data):
if data in pending:
# it means we got a response to a request we sent out
del self.pending[data]
else:
# do something else
# this sends a request to the backend
def send_to_backend(self, data):
self.pending[data] = True
while data in self.pending:
# of course this does not work
time.sleep(1)
return
もちろん、これ以上実行できないため、これは機能しませtime.sleep(1)
んread_from_backend()
。
これを解決するにはどうすればよいですか?send_to_backend()
応答が受信された場合にのみ返されるようにします。read_from_backend
メソッドからまだ戻らずに制御を譲ることができる方法はありますか?
@asynchronous と @gen.engine を使用して Web レイヤーでこれを行うのは難しいことに注意してください。これは、Web レイヤーのすべてのリクエストを完全に書き直す必要があるためです。同じデザイン パターンを別の場所に実装する方法はありますか?