You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:25:11