FastAPI 初始化中的调用次数让我感到困惑

Numbers of calls in FastAPI initialization confuses me

例如,我们以简单的 FastAPI 应用为例:

import uvicorn
from fastapi import FastAPI

print("calling main!")
app = FastAPI()

@app.get('/test', status_code=200)
async def test():
    return True


if __name__ == "__main__":
    uvicorn.run("main:app", use_colors=True, workers=2)

如果我们 运行 它,我们得到以下输出:

calling main!
INFO:     Uvicorn running on http://0.0.0.0:8020 (Press CTRL+C to quit)
INFO:     Started parent process [143621]
calling main!
calling main!
INFO:     Started server process [143832]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Started server process [143829]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
calling main!
calling main!

因此,对于具有两个工作进程(父进程 + 2 个服务器进程)的应用程序,我们执行了 5(!)次 main。为什么? 也许我遗漏了一些简单的东西,但这让我感到困惑。 预先感谢您的回答!

基于 关于 miltiprocessing 的回答。

Uvicorn 启动新流程来创建工人。它将导入父级,这给你 1 个“调用主!”对于每个工人。比工作人员将启动新服务器,这给你多了 1 个“主叫!”对于每个。工人。

您可以尝试 print('worker pid: {}, module name: {}'.format(os.getpid(), __name__)) 而不是打印来检查进程。