Tornado 6.0.2中WebSocket Handler的on_close异步实现问题
嘿,这个问题我刚好碰到过!Tornado 6.0.x版本里,on_close方法默认是同步执行的——框架并不会自动处理async def类型的on_close,所以你把它改成原生协程后,就会出现on_close was never awaited的错误。
给你两个可行的解决思路,根据你的情况选:
方案1:在同步的on_close里用IOLoop调度异步任务(兼容6.0.2)
不用把on_close改成async,而是把需要调用的异步方法丢给Tornado的IOLoop去执行,框架会自动帮你处理await:
from tornado import websocket from tornado.ioloop import IOLoop import connectionhandler class WebSocketHandler(websocket.WebSocketHandler): def initialize(self, connectionhandler): self.connectionhandler = connectionhandler async def open(self): print("WebSocket opened.") await self.connectionhandler.connection_established_websocket() def on_close(self): print("WebSocket closed.") # 把异步任务添加到IOLoop的任务队列 IOLoop.current().add_callback( self.connectionhandler.connection_closed_websocket )
原理是add_callback会将异步函数注册到事件循环中,由Tornado负责调度执行,这样既符合6.0.2版本的API规范,又能调用你的异步方法。
方案2:升级Tornado到6.1+版本(更简洁)
从Tornado 6.1开始,官方正式支持async def on_close,如果你能升级版本的话,直接把on_close改成原生协程就能正常运行了:
from tornado import websocket import connectionhandler class WebSocketHandler(websocket.WebSocketHandler): def initialize(self, connectionhandler): self.connectionhandler = connectionhandler async def open(self): print("WebSocket opened.") await self.connectionhandler.connection_established_websocket() async def on_close(self): print("WebSocket closed.") await self.connectionhandler.connection_closed_websocket()
这个版本之后框架会自动awaiton_close方法,不用额外处理,代码更简洁。
如果不能升级Tornado版本,方案1是最稳妥的选择,完全适配6.0.2的环境。
内容的提问来源于stack exchange,提问作者Sharvin26
相关产品推荐
相关产品推荐

