如何让asyncio.run启动的connect与app.run方法同时正常运行?
问题根因
asyncio.run()是阻塞当前线程的方法,启动后会一直等待传入的协程执行完成才会返回执行后续代码- 你的
AvatariaBot().connect()是长连接常驻协程,运行后不会主动退出,因此后续的app.run()永远不会被触发
解决方案
场景1:app.run为异步协程方法
将两个任务都加入同一个异步事件循环并发执行即可:
if __name__ == "__main__": loop = asyncio.get_event_loop() # 注册bot连接任务 loop.create_task(AvatariaBot().connect("api.vk.avataria.tortugasocial.com", 8123)) # 注册app启动任务 loop.create_task(app.run()) # 启动事件循环常驻运行 loop.run_forever()
场景2:app.run为同步阻塞方法(如Flask、Django默认启动逻辑)
用多线程隔离两个阻塞逻辑,避免互相影响:
import threading import asyncio # 单独封装bot启动逻辑 def run_avataria_bot(): asyncio.run(AvatariaBot().connect("api.vk.avataria.tortugasocial.com", 8123)) if __name__ == "__main__": # 子线程启动bot,设置daemon=True保证主线程退出时子线程同步销毁 bot_thread = threading.Thread(target=run_avataria_bot, daemon=True) bot_thread.start() # 主线程启动app app.run()
若两个逻辑需要交互共享数据,需额外加锁保证线程安全,避免出现数据异常。
内容的提问来源于stack exchange,提问作者Бравлер Гост
相关产品推荐
相关产品推荐

