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

FastAPI使用uvicorn多worker时打印次数超出预期问题咨询

问题原因与解决方法

核心原因:模块顶层代码被多次执行

你看到9次打印的核心问题在于脚本顶层的代码(包括你的print语句)被多个进程重复执行,常见场景如下:

1. 未用if __name__ == "__main__"包裹启动代码

如果你的脚本直接在顶层写uvicorn.run(...),而没有用if __name__ == "__main__"保护:

  • 当你执行脚本时,主进程先完整执行一遍脚本,打印1次。
  • Uvicorn启动管理进程后,每个worker进程(共4个)会重新加载app模块,再次执行顶层的print语句。
  • 若你在Windows环境下,Uvicorn不支持fork,只能用spawn创建进程,每个worker都会重新执行整个脚本,甚至可能触发额外的模块加载(比如Uvicorn内部的验证逻辑),导致打印次数远超预期。

2. 循环导入或意外的模块重复导入

如果你的app模块被其他模块循环导入,或者在代码中被多次显式导入,每次导入都会执行顶层的print语句,叠加worker进程的执行次数,最终出现9次打印。

解决步骤

  1. 用if __name__ == "__main__"隔离启动逻辑
    修改你的脚本,将uvicorn.run放在if __name__ == "__main__"块内,确保只有直接执行脚本时才启动Uvicorn,worker进程导入模块时不会重复执行启动代码:

    from fastapi import FastAPI
    
    print("Initializing app...")
    app = FastAPI()
    
    # 路由定义...
    
    if __name__ == "__main__":
        import uvicorn
        uvicorn.run("app:app", host="0.0.0.0", port=9090, workers=4)
    
  2. 检查并消除循环导入
    梳理你的模块依赖关系,确保没有app模块被其他模块循环导入的情况(比如app导入utils,utils又导入app),避免模块被意外重复加载。

  3. 验证环境与Uvicorn行为

    • 若在Windows环境,多worker模式下Uvicorn的spawn机制会导致每个worker重新执行模块顶层代码,此时你看到的打印次数应为1(主进程)+4(workers)=5次;如果还是9次,检查是否有其他代码触发了额外的模块导入。
    • 若在Linux/macOS下,Uvicorn用fork创建worker,子进程会继承父进程内存,不会重复执行顶层代码,此时打印次数应为1(主进程)+4(workers)=5次;若异常,检查是否开启了reload参数(该参数会启动额外监控进程)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:09:52