当从主进程生成新进程时(因为这就是当uvicorn.run()
被调用),保护入口点以避免递归生成子进程等非常重要。如中所述本文 https://superfastpython.com/multiprocessing-spawn-runtimeerror/:
如果入口点未使用 if 语句习惯用法进行保护
检查顶级环境,然后是脚本将执行
再次直接,而不是按预期运行新的子进程。
保护入口点确保程序只启动
一次,主进程的任务仅由主进程执行
进程而不是子进程。
基本上,创建新进程的代码必须位于if __name__ == '__main__': https://stackoverflow.com/questions/419163/what-does-if-name-main-do. Hence:
from uvicornmodule import main
if __name__ == "__main__":
main.start_server()
此外,running uvicorn以编程方式 https://www.uvicorn.org/#running-programmatically并拥有reload
and/or workers
标志已启用,您must将应用程序作为导入字符串传递,格式为"<module>:<attribute>"
。例如:
# main.py
import uvicorn
from fastapi import FastAPI
app = FastAPI()
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)
作为旁注,如果reload
and/or workers
未使用标志:
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
另外,根据FastAPI文档 https://fastapi.tiangolo.com/tutorial/first-steps/#first-steps,当通过以下方式从终端运行服务器时(默认port
is 8000
。查看所有可用的命令行选项 https://www.uvicorn.org/#command-line-options):
> uvicorn main:app --reload
命令uvicorn main:app
指:
-
main
: 文件main.py
(Python“模块”)。
-
app
:在其中创建的对象main.py
与线app = FastAPI()
.
-
--reload
:代码更改后重新启动服务器。仅用于开发.