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

基于Tornado+aiomysql的博客应用无报错但控制台卡顿求助

排查Tornado+aiomysql博客应用启动后控制台冻结的问题

我看了你的代码,控制台冻结且无错误输出的情况,主要是两个关键问题导致的,咱们一步步来修复:

1. Application初始化时缺少必需的db参数

你的Application类的__init__方法明确要求传入db参数,但在main函数里实例化时写成了app = Application(),这会触发TypeError。不过因为代码在run_sync上下文里执行,错误可能被隐式处理,没在控制台显示出来,同时后续的shutdown_event.wait()会让程序直接进入无限阻塞状态。

修复方法:
把main函数里的这行代码:

app = Application()

修改为:

app = Application(db)

2. 未触发的shutdown_event导致无限阻塞

你定义了shutdown_event = tornado.locks.Event()并执行await shutdown_event.wait(),但没有任何代码去触发这个事件(比如监听系统终止信号),所以程序启动后会一直卡在等待状态,控制台看起来就是“冻结”了。

修复方法:
添加信号监听逻辑,当收到Ctrl+C(SIGINT)或系统终止信号(SIGTERM)时触发事件,让程序可以正常退出。修改后的main函数如下:

async def main():
    tornado.options.parse_command_line()
    async with create_pool(
        host=options.db_host,
        port=options.db_port,
        user=options.db_user,
        password=options.db_password,
        db=options.db_database,
    ) as db:
        await maybe_create_tables(db)
        app = Application(db)  # 修复db参数问题
        app.listen(options.port)
        print(f"博客应用已启动,访问地址:http://localhost:{options.port}")  # 添加启动提示

        shutdown_event = tornado.locks.Event()
        
        # 监听终止信号,触发shutdown事件
        def handle_shutdown(sig, frame):
            print("\n正在关闭应用...")
            shutdown_event.set()
        
        import signal
        signal.signal(signal.SIGINT, handle_shutdown)
        signal.signal(signal.SIGTERM, handle_shutdown)

        await shutdown_event.wait()
        # 可选:添加数据库连接池的清理逻辑
        db.close()
        await db.wait_closed()

额外检查点

  • 确认项目根目录下存在schema.sql文件,否则maybe_create_tables函数会抛出文件找不到的异常,也可能导致程序异常
  • 修改完成后启动程序,控制台如果输出启动提示,说明程序正常运行,此时访问http://localhost:8080应该能看到hello内容,按Ctrl+C可以正常退出程序

内容的提问来源于stack exchange,提问作者jackal221

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:59:24