【发布时间】:2020-10-25 03:22:45
【问题描述】:
我想在 Tornado 框架中实现一个基于 Web 套接字的服务。当用户关闭 Web 套接字时,我想通知其他用户。但是,on_close 显然是一个阻塞函数,而我的 _broadcast(str) -> None 函数是异步的。
我怎么能调用这个函数呢?
from tornado import websocket
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class SocketHandler(websocket.WebSocketHandler):
async def open(self, *args, conns, **kwargs):
logger.info(f"Opened a new connection to client {id(self)}")
self._conns = conns
async def on_message(self, message):
logger.info(f"Client {id(self)} sent message: {message}")
await self._broadcast(message)
def on_close(self):
logger.info(f"Client {id(self)} has left the scene")
self._conns.remove(self)
self._broadcast("something") # TODO
async def _broadcast(self, msg):
for conn in self._conns:
try:
await conn.write_message(msg)
except websocket.WebSocketClosedError:
pass
app = web.Application([
(r'/ws', SocketHandler)
])
if __name__ == '__main__':
app.listen(9000)
ioloop.IOLoop.instance().start()
【问题讨论】:
标签: python async-await tornado