假设我有一个无限while
循环,等待WebSocket Tornado客户端连接的read_message()
方法。然后,我从外部触发一个发送消息的函数,并应立即响应
由于一切都是异步的,我会假设当外部调用发生时,执行会转到它。但是,当我尝试在该调用中侦听响应时,它会抛出AssertionError
,表明self.read_future
不是None
,应该是什么时候。
以下是客户端应用程序的方法。稍早,它连接到服务器并将连接放在self.conn
变量中:
async def loop(self):
while True:
print(await self.conn.read_message())
async def ext_call(self):
self.conn.write_message('Hello, World!')
response = await self.conn.read_message() # This line fails
为什么我不能在两个不同的地方收听消息?
答案 0 :(得分:2)
你要求的是含糊不清的 - 哪些消息会传到哪个地方?在发送" Hello world"之后,看起来您可能意味着下一条消息到达要在ext_call
中处理,要在loop
中打印所有其他内容。但系统怎么知道呢?考虑一下" Hello world"在python解释器执行read_message
中的ext_call
调用之前,可以将消息发送到客户端并收到响应,因此它将被路由到等待read_message
} loop
。
通常,您希望使用其中一种模式,但不能同时使用这两种模式。如果您始终拥有匹配的请求/响应消息对,则可以在ext_call
之后发送后阅读。但是,如果您的消息可能不是请求/响应对的一部分,则需要一个循环来读取所有消息并决定如何处理它们(可能按类型拆分它们并发出它们使用tornado.queues
模块在一个或多个队列上。