【问题标题】:How to broadcast a message to tornado socket clients all at once?如何一次向龙卷风套接字客户端广播消息?
【发布时间】:2020-02-04 13:46:03
【问题描述】:

我正在运行一个 tornado 应用程序,但我意识到每次与套接字建立新连接时,它都会创建一个新的服务器实例,而不是将新连接添加到 self.connections。由于这种行为,我无法同时向所有连接广播消息。如何让应用使用现有实例运行?

import asyncio
import tornado.ioloop
import tornado.web
import tornado.websocket
import tornado.wsgi
import time


class EchoWebSocket(tornado.websocket.WebSocketHandler):

    def initialize(self, tornado_output_queue):
        self.connections = set()

    def open(self):
        print("WebSocket opened")
        self.connections.add(self)

    def on_message(self, message):
        for client in self.connections:
            await client.write_message(str(time.time()))

    def on_close(self):
        print("WebSocket closed")

    def check_origin(self, origin):
        return True


def make_app():
    "initializes the web server"
    return tornado.web.Application([
        (r"/websocket", EchoWebSocket)
    ])


if __name__ == "__main__":
    webapp = make_app()
    application = tornado.wsgi.WSGIContainer(webapp)
    webapp.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

我已经阅读了 tornado.ioloop.IOLoop.currenttornado.ioloop.IOLoop.instance(我正在使用)的相关信息,但文档说 .instance 只是 .current 的别名。

【问题讨论】:

    标签: python sockets websocket tornado python-asyncio


    【解决方案1】:

    Tornado 为每个连接创建一个新的处理程序实例。要跟踪所有连接的客户端,您必须在类上创建 connections 对象:

    class EchoWebSocket(...):
        connections = set()
    

    【讨论】:

    • 虽然这在概念上应该有所帮助,但我尝试了它并且它的混乱;导致 WebSocketClosedError(s) 大幅增加。鉴于我的服务器目前提供超过 6 个客户端,为什么集中连接存储会导致这么多错误?
    • @simic0de 可能是因为您在 WSGI 模式下运行服务器。不建议这样做。请参阅此答案:stackoverflow.com/a/38191340/1925257 为什么要在 WSGI 容器中运行 Tornado?如果您没有特殊用例,请以常规方式运行 Tornado。无论如何,我只是在这里猜测。错误的实际原因很可能是其他原因。
    • 我在 AWS ec2 上运行服务器,这就是我使用 WSGI 的原因;它无法在 HTTPServer 上运行
    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多