如何解决为什么当我在FastAPI服务中启动uvicorn时,我的配置方法运行两次?
我已经使用fastapi和uvicorn编写了服务。我的服务中有一个主要的工具可以启动uvicorn(请参阅下文)。在那主要方面,我要做的第一件事是负载配置设置。我有一些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)
运行服务时的输出如下:
Loading configuration settings...
Loading configuration settings...
Loaded Configuration
为什么将“ CdfAuthConfig()”类实例化两次?显然,它与“ uvicorn.run”命令有关。
解决方法
我有一个类似的设置,这种行为让我很好奇,我做了一些测试,现在我大概明白了原因。
您的 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)
我希望这能帮助您更好地理解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。