如何使用 Tornado 监听来自多个地方的传入 websocket 消息?

How to listen for incoming websocket messages from multiple places using Tornado?

假设我有一个无限 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

为什么我不能在两个不同的地方收听消息?

您要求的内容不明确 - 哪些消息会发送到哪个位置?看起来您的意思可能是在发送 "Hello world" 后在 ext_call 中处理下一条消息,并在 loop 中打印所有其他消息。但是系统怎么会知道呢?考虑到 "Hello world" 消息可以发送到客户端 并且在 python 解释器执行 read_message 中的 [=10] 调用之前接收到响应 =], 所以它将被路由到 loop.

中等待的 read_message

一般来说,您希望使用其中一种模式,但不会同时使用两种模式。如果您总是匹配 request/response 对消息,您可以在发送后阅读 ext_call。但是,如果您可能有不属于 request/response 对的消息,则需要 one 循环来读取所有消息并决定如何处理它们(可能将它们分开按类型并使用 tornado.queues 模块将它们发送到一个或多个队列。