如何使用 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
模块将它们发送到一个或多个队列。
假设我有一个无限 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
模块将它们发送到一个或多个队列。