我有以下问题。
我在基于龙卷风的应用程序服务器上工作。大多数代码可以是同步的,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
而不从该方法返回?
请注意,在 web 层使用 @asynchronous 和 @gen.engine 很难做到这一点,因为这需要完全重写我们 web 层中的所有请求。有没有办法可以在其他地方实现相同的设计模式?