【问题标题】:FastAPI, uvicorn.run() always create 3 instances, but I want it 1 instanceFastAPI, uvicorn.run() 总是创建 3 个实例,但我想要 1 个实例
【发布时间】:2021-12-10 06:43:30
【问题描述】:

我在 PyCharm IDE 上运行 FastAPI,它总是运行 3 个 worker。 我不知道为什么,但是每次 API 调用都会访问最后一个创建的实例。

任何人都可以帮助我如何获得一个正在运行的工人吗?

代码:

import uvicorn
from fastapi import FastAPI
from fastapi.templating import Jinja2Templates
from starlette.middleware.cors import CORSMiddleware

app = FastAPI()
app.add_middleware(CORSMiddleware,
                   allow_origins=["*"],
                   allow_methods=["*"],
                   allow_headers=["*"])
print(f"main.py with :{app}")


@app.get('/')
def home():
    return "Hello"


if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=False, log_level="debug", debug=True,
                workers=1, limit_concurrency=1, limit_max_requests=1)

控制台输出:

/Users/user/.pyenv/versions/3.7.10/bin/python /Users/user/github/my-project/backend/main.py
main.py with :<fastapi.applications.FastAPI object at 0x102b35d50>
INFO:     Will watch for changes in these directories: ['/Users/user/github/my-project/backend']
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [96259] using statreload
main.py with :<fastapi.applications.FastAPI object at 0x10daadf50>
main.py with :<fastapi.applications.FastAPI object at 0x1106bfe50>
INFO:     Started server process [96261]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

【问题讨论】:

  • 嗨@John,你为什么说总是有3个工人?我在日志中看不到任何内容。如果有多个工作人员,您将重复最后 3 个“INFO”
  • 嗨 @Emmanuel-Lin,main.py 已创建,我认为这是因为 3 名工人正在运行
  • 那是线程吗?你知道如何让它只被调用一次吗?如果我运行命令uvicorn main:app --workers 1,那么它只会调用一次。
  • main.py 已创建”是什么意思?我相信您的配置已经在一个工作人员上运行
  • FastAPI() 的实例被创建了 3 次,如日志所示。

标签: python fastapi uvicorn


【解决方案1】:

感谢您的最后评论,我更好地理解了您的问题。

你真正的问题

所以实际上你的问题是为什么 FastAPI 对象被创建了 3 次。

在日志中确实可以看到你有 3 个不同的内存地址0x102b35d500x10daadf500x1106bfe50

这并不意味着你有 3 个工人,只是 FastAPI 对象被创建了 3 次。最后一个是您的 API 将使用的那个。

为什么会发生

对象被多次创建,因为:

  1. 首先,您运行main.py,它会遍历所有代码(FastAPI 对象的一个​​创建),然后到达__main__
  2. 然后uvicorn 启动main:app,让它再次转到文件main.py 并构建另一个FastAPI 对象。
  3. 最后一个由 debug=True 创建,当您将其设置为 False 时,您将少创建一个 FastAPI 对象。我不太清楚为什么。

解决方案

解决方案是将 API 定义与 API 的开头分开。

例如,可以使用以下内容创建run.py 文件:

import uvicorn

if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=False, log_level="debug", debug=True,
                workers=1, limit_concurrency=1, limit_max_requests=1)

并启动此文件。

另一种选择是在命令行中启动您的 API:

uvicorn main:app --host=0.0.0.0 --port=8000 --log-level=debug --limit-max-requests=1 --limit-concurrency=1

你可以找到所有的命令行参数here

【讨论】:

  • 谢谢。您的回答在各个方面都对我有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多