【问题标题】:Why when I start uvicorn in my FastAPI service does my configuration method run twice?为什么当我在我的 FastAPI 服务中启动 uvicorn 时,我的配置方法会运行两次?
【发布时间】:2020-09-22 05:08:02
【问题描述】:

我使用 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)

我运行服务时的输出如下:

Loading configuration settings...
Loading configuration settings...
Loaded Configuration

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

【问题讨论】:

  • 由于 "Loaded Configuration" 没有打印两次,我认为配置没有被加载两次。
  • 需要看看你怎么打印Loading configuration settings...
  • 我认为这个问题需要更多信息才能正确回答。
  • Loading configuration settings...Loaded congifurationuvicorn.run() 之前运行,问题不在 uvicorn 上。
  • 你介意分享你用来运行uvicorn的命令行吗?

标签: python-3.x fastapi uvicorn


【解决方案1】:

我有一个类似的设置,这种行为让我很好奇,我做了一些测试,现在我大概明白了原因。

您的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)

我希望这可以帮助您更好地理解。

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多