我已经使用fastapi和uvicorn编写了一个服务。我的服务中有一个main,它启动uvicorn (如下所示)。基本上,我要做的第一件事就是加载配置设置。当我加载配置时,我有一些输出设置的信息输出。我注意到当我启动我的服务时,配置加载方法似乎运行了两次。
# 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)
当我运行服务时,输出如下所示:
Loading configuration settings...
Loading configuration settings...
Loaded Configuration
为什么"CdfAuthConfig()“类被实例化两次?这显然与"uvicorn.run“命令有关。
发布于 2021-02-15 00:58:10
我有一个类似的设置,这个行为让我很好奇,我做了一些测试,现在我知道为什么了。
您的if __name__ == "__main__":
只能访问一次,这是事实。
你怎么能测试这个。在if之前添加以下行:
print(__name__)
如果您按原样运行代码,但添加了我提到的代码行,它将打印:
__main__ # in the first run
然后uvicorn将再次调用您的程序,并输出如下内容:
__mp_main__ # after uvicorn starts your code again
然后它也会打印出来:
app # since this is the argument you gave to uvicorn
如果你想避免这种情况,你应该从命令行调用uvicorn,如下所示:
uvicorn main:app --reload --host 0.0.0.0 --port 5000 # assuming main.py is your file name
uvicorn将重新加载您的代码,因为您是从代码内部调用它的。也许一种解决办法是将uvicorn调用放在一个单独的文件中,或者如我所说,只需使用命令行。如果你不想一直写带参数的命令,你可以写一个小脚本(app_start.sh)
我希望这能帮助你更好地理解。
https://stackoverflow.com/questions/64003384
复制相似问题