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

时间:2016-12-10 17:23:15

标签: python python-3.x websocket 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

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

1 个答案:

答案 0 :(得分:2)

你要求的是含糊不清的 - 哪些消息会传到哪个地方?在发送" Hello world"之后,看起来您可能意味着下一条消息到达要在ext_call中处理,要在loop中打印所有其他内容。但系统怎么知道呢?考虑一下" Hello world"在python解释器执行read_message中的ext_call调用之前,可以将消息发送到客户端并收到响应,因此它将被路由到等待read_message } loop

通常,您希望使用其中一种模式,但不能同时使用这两种模式。如果您始终拥有匹配的请求/响应消息对,则可以在ext_call之后发送后阅读。但是,如果您的消息可能不是请求/响应对的一部分,则需要一个循环来读取所有消息并决定如何处理它们(可能按类型拆分它们并发出它们使用tornado.queues模块在​​一个或多个队列上。