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__))
而不是打印来检查进程。
例如,我们以简单的 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。为什么? 也许我遗漏了一些简单的东西,但这让我感到困惑。 预先感谢您的回答!
基于
Uvicorn 启动新流程来创建工人。它将导入父级,这给你 1 个“调用主!”对于每个工人。比工作人员将启动新服务器,这给你多了 1 个“主叫!”对于每个。工人。
您可以尝试 print('worker pid: {}, module name: {}'.format(os.getpid(), __name__))
而不是打印来检查进程。