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

如何让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,提问作者Бравлер Гост

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:12:01