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

为何Flask调用app.run后后续代码需停止服务器才执行?

为什么app.run()之后的print('2')不会立即执行?

嗨,这个问题其实是Flask开发里很常见的小坑——app.run()在默认情况下是阻塞(blocking)的!它启动Flask的开发服务器后,会一直霸占主线程来处理用户的请求,直到你手动停止服务器(比如按Ctrl+C)。所以在它之后的代码,自然要等它彻底退出后才会有机会执行。

怎么让app.run()之后的代码也能正常运行?

给你几个实用的解决方案,分场景来看:

  1. 开发场景:用后台线程启动服务器
    你可以借助Python的threading模块,把app.run()放到单独的子线程里,这样主线程就能继续往下执行print('2')了:

    from flask import Flask
    import threading
    import config
    
    app = Flask(__name__)
    
    print('1')
    
    # 封装启动服务器的函数
    def start_flask_server():
        app.run(host=config.server_address, port=config.server_port)
    
    # 在子线程中启动服务器
    server_thread = threading.Thread(target=start_flask_server)
    server_thread.start()
    
    print('2')
    

    注意哦,这种方式只适合开发阶段测试用,生产环境别这么搞!

  2. 如果是要做启动后的初始化操作
    如果你只是想在服务器启动完成后执行一些初始化逻辑(比如连接数据库、加载配置),其实不用把代码放在app.run()后面。Flask提供了专门的生命周期钩子,比如Flask 2.0+的@app.before_app_first_request:

    @app.before_app_first_request
    def after_server_start():
        print("服务器已经启动完成,开始执行初始化操作啦!")
    

    这个函数会在第一个请求到达服务器时自动执行,既保证服务器已经正常启动,又符合Flask的设计逻辑。

  3. 生产环境:用专业WSGI服务器
    生产环境下绝对不要用app.run()来启动服务!建议用Gunicorn、uWSGI这类专业的WSGI服务器,比如用Gunicorn启动的命令是:

    gunicorn -w 4 -b {config.server_address}:{config.server_port} your_app_module:app
    

    这种情况下,你的应用逻辑和服务器启动是完全分离的,初始化操作可以通过Flask的钩子或者独立的启动脚本处理。

补充小细节

如果开启了Flask的调试模式(debug=True),服务器还会启动一个重载器进程,这时候代码执行顺序会更复杂——重载器会重启你的应用,所以print('1')可能会被打印两次,这种情况下用线程的方式也要记得加上use_reloader=False参数,避免重载带来的问题:

app.run(host=config.server_address, port=config.server_port, use_reloader=False)

内容的提问来源于stack exchange,提问作者Mohamed Thasin ah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:45:22