我正在运行一个 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.current
和tornado.ioloop.IOLoop.instance
(我正在使用),但是文档说.instance
只是.current
的别名。
最佳答案
Tornado 为每个连接创建处理程序的新实例。要跟踪所有已连接的客户端,您必须在类上创建connections
对象:
class EchoWebSocket(...):
connections = set()
关于python - 如何一次向 Tornado 套接字客户端广播消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60058778/