基于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
相关产品推荐
相关产品推荐

