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

Flask与TelegramBot无法在不同线程并行启动问题咨询

问题原因及解决方案

核心问题

你代码里的线程创建逻辑写错了——你直接执行了app.run()并把它的返回值传给了Thread的target参数,而不是把app.run这个函数本身交给线程去执行。

app.run()是阻塞式函数,一旦调用就会占用当前主线程,直到Flask服务停止。所以你的代码实际执行顺序是:

  1. 主线程执行app.run(...),阻塞在这里直到Flask服务被终止
  2. 主线程继续执行,创建线程(但此时target是app.run()的返回值None,线程不会做任何事)
  3. 主线程才开始执行bot.infinity_polling()

这就导致两者根本没并行起来。

修正后的代码

把app.run作为函数对象传给target,用kwargs传递参数:

if __name__ == '__main__':
    try:
        # 将app.run函数本身作为target,参数通过kwargs传递
        Thread(target=app.run, kwargs={'port': Api.port, 'debug': True, 'use_reloader': False}).start()
        bot.infinity_polling()
    except Exception as exception:
        logging.error(exception)

关键说明

  • Thread的target参数需要接收可调用的函数/方法对象,而不是函数执行后的结果。当你写app.run(...)时,Python会立刻执行这个函数,而不是把它作为异步任务交给线程。
  • 你设置的use_reloader=False是正确的,它避免了Flask调试模式下重载器创建额外进程的问题,不会干扰线程运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:04:57