Gre*_*egH 12 python-3.x fastapi uvicorn
我使用 fastapi 和 uvicorn 编写了一个服务。我的服务中有一个启动 uvicorn 的 main (见下文)。主要是,我做的第一件事是加载配置设置。我有一些 INFO 输出,可以在加载配置时输出设置。我注意到当我启动服务时,配置加载方法似乎运行了两次。
# INITIALIZE
if __name__ == "__main__":
# Load the config once at bootstrap time. This outputs the string "Loading configuration settings..."
config = CdfAuthConfig()
print("Loaded Configuration")
# Create FastAPI object
app = FastAPI()
# Start uvicorn
uvicorn.run(app, host="127.0.0.1", port=5050)
Run Code Online (Sandbox Code Playgroud)
我运行该服务时的输出如下所示:
Loading configuration settings...
Loading configuration settings...
Loaded Configuration
Run Code Online (Sandbox Code Playgroud)
为什么“CdfAuthConfig()”类被实例化两次?它显然与“uvicorn.run”命令有关。
小智 10
我有一个类似的设置,这种行为让我很好奇,我做了一些测试,现在我大概明白了原因。
您的if __name__ == "__main__":
联系仅一次,这是事实。
你如何测试这个。在 if 之前添加以下行:
print(__name__)
Run Code Online (Sandbox Code Playgroud)
如果您按原样运行代码,但添加我提到的行,它将打印:
__main__ # in the first run
Run Code Online (Sandbox Code Playgroud)
然后 uvicorn 将再次调用您的程序并打印如下内容:
__mp_main__ # after uvicorn starts your code again
Run Code Online (Sandbox Code Playgroud)
之后它还会打印:
app # since this is the argument you gave to uvicorn
Run Code Online (Sandbox Code Playgroud)
如果你想避免这种情况,你应该从命令行调用 uvicorn,例如:
uvicorn main:app --reload --host 0.0.0.0 --port 5000 # assuming main.py is your file name
Run Code Online (Sandbox Code Playgroud)
uvicorn 将重新加载您的代码,因为您是从代码内部调用它的。也许解决方法是将 uvicorn 调用放在单独的文件中,或者正如我所说,只需使用命令行。如果你不想一直用参数编写命令,你可以编写一个小脚本(app_start.sh)
我希望这可以帮助您更好地理解。
归档时间: |
|
查看次数: |
3815 次 |
最近记录: |