我运行uvicorn main:app --reload来启动 FastAPI 服务器。服务器正在运行,但我在控制台上看到一条警告:
WARNING: The --reload flag should not be used in production on Windows.
Run Code Online (Sandbox Code Playgroud)
下面是我的代码:
WARNING: The --reload flag should not be used in production on Windows.
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我会看到这个?该警告的原因是什么?
我有一个使用Uvicornwith的应用程序FastAPI。我还打开了一些连接(例如到MongoDB)。SIGINT一旦出现某些信号( 、SIGTERM和) ,我想优雅地关闭这些连接SIGKILL。
我的server.py文件:
import uvicorn
import fastapi
import signal
import asyncio
from source.gql import gql
app = fastapi.FastAPI()
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
app.mount("/graphql", gql)
# handle signals
HANDLED_SIGNALS = (
signal.SIGINT,
signal.SIGTERM
)
loop = asyncio.get_event_loop()
for sig in HANDLED_SIGNALS:
loop.add_signal_handler(sig, _some_callback_func)
if __name__ == "__main__":
uvicorn.run(app, port=6900)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我尝试实现这一目标的方法不起作用。当我尝试Ctrl+C在终端中时,没有任何反应。我相信这是因为Uvicorn是在不同的线程中启动的......
这样做的正确方法是什么?我注意到了uvicorn.Server.install_signal_handlers()这个功能,但使用起来并不幸运......
好的,所以我正在对 进行比较研究using ASYNC vs without using ASYNC in FastAPI。然而,我得到了一些意想不到的结果,并且不明白为什么。
import uvicorn
from fastapi import FastAPI
import PIL.Image as Image
import requests
from loguru import logger
import sys
log_format = "{level} {process}-{thread} {time} {name}:{line} - {message}"
logger.remove()
logger.add(sys.stderr, format=log_format, backtrace=True, diagnose=True)
logger.add("logs/" + "t_{time}.log", format=log_format, colorize=True, backtrace=True, diagnose=True)
Image.MAX_IMAGE_PIXELS = None
def get_the_image_from_net():
a = requests.get("https://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73751/world.topo.bathy.200407.3x21600x21600.A1.jpg")
return True
app = FastAPI()
@app.get("/expectoPatronum")
def get_image_of_the_new_world():
"""
Gets Image of the World
"""
logger.info("Received request for getting …Run Code Online (Sandbox Code Playgroud) 安装正确的软件包后出现上述错误
Python --版本
Python 3.6.9
安装命令
pip3 安装 httpx
点 3 列表
anyio (3.6.1)
async-generator (1.10)
Brotli (1.0.9)
certifi (2022.6.15)
charset-normalizer (2.1.0)
contextvars (2.4)
dataclasses (0.8)
dnspython (2.2.1)
email-validator (1.2.1)
h11 (0.12.0)
httpcore (0.14.7)
httpx (0.22.0)
idna (3.3)
immutables (0.18)
MarkupSafe (2.0.1)
pip (9.0.1)
pkg-resources (0.0.0)
pydantic (1.9.1)
python-dateutil (2.8.2)
rfc3986 (1.5.0)
setuptools (39.0.1)
six (1.16.0)
sniffio (1.2.0)
typing-extensions (4.1.1)
validator (0.7.1)
Run Code Online (Sandbox Code Playgroud)
在虚拟环境交互式 shell 中,该包也可以正常工作
(env) PEOPLE\saurabhkamble@lp7948:/var/www/vip_select_shaadi_api$ uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['/var/www/vip_select_shaadi_api']
INFO: …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的服务器配置为请求超时,但我找不到有关它的任何信息。我看到uvicorn有一个名为 的属性keep_alive_timeout,默认为 5 秒。但这似乎也不起作用。
例如:
app = FastAPI()
@app.get('/test')
def test_endpoint():
sleep(10)
Run Code Online (Sandbox Code Playgroud)
我希望请求在 5 秒后断开连接并超时,但它仍然存在并返回 200。
有人知道如何设置吗?
我在 AWS Fargate 上使用 Python 3.10.1 和应用程序负载均衡器部署了 FastAPI 0.81.0 + uvicorn 0.18.3。服务器在我的本地 Docker 中无限期地运行(如预期),但是在 AWS 上,应用程序总是在 1-2 分钟后关闭。
这是 Docker 中的 uvicorn 调用:
CMD ["uvicorn", "--host", "0.0.0.0", "--port", "8000", "--log-level", "trace", "app.main:app"]
Run Code Online (Sandbox Code Playgroud)
我的 FastAPI 应用程序如下所示:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app = FastAPI()
origins = [
"*"
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def root():
return {"Hello": "World"}
Run Code Online (Sandbox Code Playgroud)
这可能与负载均衡器有关,因为我的 Fargate 服务的 RAM 使用率并不太高:
通常的怀疑似乎是通过 TCP 而不是 HTTP 进行运行状况检查,但是据我所知,Fargate …
amazon-web-services aws-fargate aws-application-load-balancer fastapi uvicorn
我部署的应用程序是K8s下的FastAPI with Uvicorn。在尝试了解如何对应用程序进行 Docker 化时,我明白我想在没有 Gunicorn 的情况下实现 Uvicorn,并添加一个根据应用程序收到的请求负载进行扩展/缩减的系统。我做了很多负载测试,发现默认情况下有 1 个 Uvicorn 工作人员,我可以获得 3.5 RPS,而将工作人员更改为 8 个时,我可以轻松获得 22 RPS(没有检查更多,因为这对我来说效果很好) 。
现在,我对资源的期望是,我必须提供的 CPU 限制为 8(我假设每个工作人员在一个进程和线程上工作),但我只看到内存使用量增加,但大麦在CPU中。也许是因为应用程序不使用那么多的 CPU,但它确实有可能使用超过 1 个 CPU?到目前为止,它没有使用超过一个CPU。
Uvicorn 工人如何工作?我应该如何计算该应用程序需要多少工作人员?我没有找到任何有用的信息。
我目前有一个使用 uvicorn 部署的 fastapi,它使用threading. 该线程是无限的(它是每 x 秒更新一次的例程)。在我更新到 python 3.10 之前,一切都工作正常,每次我更改代码时,服务器都会检测到更改并重新加载,在 init 处杀死并创建一个新线程。
但是现在,当我修改代码时,服务器会检测到更改并尝试重新加载,但创建的线程不会被终止(打印仍然继续在控制台中流动),从而避免服务器完全重新加载。
my print from my thread
WARNING: StatReload detected changes in 'app\api.py'. Reloading...
INFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [3736]
my print from my thread
my print from my thread
...
Run Code Online (Sandbox Code Playgroud)
如果我在控制台中按 ctrl+C,则效果相同。线程保持活动状态 目前我的解决方案是kill PID每次我想刷新时都刷新,但这有点烦人。
我尝试回到 python 3.7.9 但问题仍然存在。我还尝试实施atexit并手动终止该进程,但没有成功。
有关如何正确处理此问题的任何线索?
我在uvicorn的源代码中看到了一个 python dict 日志配置。
在那,他们将格式化程序定义为
{
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(levelprefix)s %(asctime)s %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S",
},
"access": {
"()": "uvicorn.logging.AccessFormatter",
"fmt": '%(levelprefix)s %(asctime)s :: %(client_addr)s - "%(request_line)s" %(status_code)s',
"use_colors": True
},
}Run Code Online (Sandbox Code Playgroud)
此外,我们可以看到,他们定义了一个空的记录器(不知道我应该怎么称呼它),
"": {"handlers": ["default"], "level": "INFO"},
^^^^ - see, Empty key
Run Code Online (Sandbox Code Playgroud)
所以,这是我的问题,
"()"在做格式化蟒蛇记录的部分?""在做伐木工人部分蟒蛇记录?我正在学习 fastapi,我正在本地主机上启动一个 uvicorn 服务器。每当出现错误/异常时,我都没有得到回溯。我得到的只是:INFO: 127.0.0.1:56914 - "POST /create/user/ HTTP/1.1" 500 Internal Server Error
所以,很难调试,我正在尝试python的日志模块
import logging
log = logging.getLogger("uvicorn")
log.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
我也试过用调试参数启动 uvicorn
if __name__ == "__main__":
dev = 1
print("printing")
if dev == 1:
uvicorn.run('main:app', host="127.0.0.1", port=5000, log_level="info", reload=True, debug=True)
if dev == 2:
uvicorn.run('main:app', host="127.0.0.1", port=5000, log_level="info", workers=2)
still the same problem persists. I am in development phase and I need to error traceback,please guide.
Run Code Online (Sandbox Code Playgroud)