首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么当我在FastAPI服务中启动uvicorn时,我的配置方法会运行两次?

为什么当我在FastAPI服务中启动uvicorn时,我的配置方法会运行两次?
EN

Stack Overflow用户
提问于 2020-09-22 13:08:03
回答 1查看 863关注 0票数 4

我已经使用fastapi和uvicorn编写了一个服务。我的服务中有一个main,它启动uvicorn (如下所示)。基本上,我要做的第一件事就是加载配置设置。当我加载配置时,我有一些输出设置的信息输出。我注意到当我启动我的服务时,配置加载方法似乎运行了两次。

代码语言:javascript
运行
复制
# 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)

当我运行服务时,输出如下所示:

代码语言:javascript
运行
复制
Loading configuration settings...
Loading configuration settings...
Loaded Configuration

为什么"CdfAuthConfig()“类被实例化两次?这显然与"uvicorn.run“命令有关。

EN

回答 1

Stack Overflow用户

发布于 2021-02-15 00:58:10

我有一个类似的设置,这个行为让我很好奇,我做了一些测试,现在我知道为什么了。

您的if __name__ == "__main__":只能访问一次,这是事实。

你怎么能测试这个。在if之前添加以下行:

代码语言:javascript
运行
复制
 print(__name__)

如果您按原样运行代码,但添加了我提到的代码行,它将打印:

代码语言:javascript
运行
复制
__main__  # in the first run

然后uvicorn将再次调用您的程序,并输出如下内容:

代码语言:javascript
运行
复制
__mp_main__  # after uvicorn starts your code again

然后它也会打印出来:

代码语言:javascript
运行
复制
app  # since this is the argument you gave to uvicorn

如果你想避免这种情况,你应该从命令行调用uvicorn,如下所示:

代码语言:javascript
运行
复制
uvicorn main:app --reload --host 0.0.0.0 --port 5000  # assuming main.py is your file name

uvicorn将重新加载您的代码,因为您是从代码内部调用它的。也许一种解决办法是将uvicorn调用放在一个单独的文件中,或者如我所说,只需使用命令行。如果你不想一直写带参数的命令,你可以写一个小脚本(app_start.sh)

我希望这能帮助你更好地理解。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64003384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档