Flask与TelegramBot无法在不同线程并行启动问题咨询
问题原因及解决方案
核心问题
你代码里的线程创建逻辑写错了——你直接执行了app.run()并把它的返回值传给了Thread的target参数,而不是把app.run这个函数本身交给线程去执行。
app.run()是阻塞式函数,一旦调用就会占用当前主线程,直到Flask服务停止。所以你的代码实际执行顺序是:
- 主线程执行
app.run(...),阻塞在这里直到Flask服务被终止 - 主线程继续执行,创建线程(但此时
target是app.run()的返回值None,线程不会做任何事) - 主线程才开始执行
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
相关产品推荐
相关产品推荐

