标签: uvicorn

FastAPI websocket ping/pong 超时

我正在使用 FastAPI 来@app.websocket监听传入的 websocket。FastAPI(或下面的 Starlette 或 Uvicorn)如何进行 ping/pong 心跳?这是可配置的吗?我根本无法在文档中找到它。

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/")
def ws(websocket: WebSocket):
    pass
Run Code Online (Sandbox Code Playgroud)

fastapi使用starlette,并且在幕后似乎使用websocketswebsockets.connect默认情况下使用 20 秒的 aping_intervalping_timeout,但我不知道 FastAPI 中是否使用了它。

websocket starlette fastapi uvicorn

10
推荐指数
1
解决办法
8587
查看次数

在 Azure 应用服务上部署 FastAPI 和 uvicorn

我想将一个简单的 FastAPI/uvicorn 部署到 Azure 应用程序服务上。

每次部署时,一切似乎都运行顺利,但当我输入 Web 应用程序的 URL 时,我会收到以下错误消息:

“错误信息

在我的本地机器上,uvicorn 工作正常。在我的网络服务上,我运行 python 3.7 和 fastapi 0.62.0。

每次部署时,我都会启动一个名为startup.sh的文档,其中仅包含一行代码:

python -m uvicorn main:app --host 0.0.0.0 --port 80

非常感谢帮助!

deployment azure azure-web-app-service fastapi uvicorn

10
推荐指数
2
解决办法
1万
查看次数

Uvicorn 异步工作线程仍在同步工作

问题简述

我已将我的项目从 Django 2.2 迁移到 Django 3.2,现在我想开始使用异步视图的可能性。我创建了一个异步视图,设置了 asgi 配置,并使用 Uvicorn 工作程序运行 Gunicorn。当该服务器同时有 10 个用户时,他们会被同步服务。我需要配置什么才能为 10 个并发用户提供异步视图?

详细问题

这是我到目前为止在本地环境中所做的:

  • 我正在使用 Django 3.2.10 和 Python 3.9。
  • 我已经安装gunicornuvicorn通过 pip
  • 我创建了一个asgi.py包含以下内容的文件
    import os
    from django.core.asgi import get_asgi_application
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyService.settings.local')
    application = get_asgi_application()
Run Code Online (Sandbox Code Playgroud)
  • 我创建了一个具有以下实现的视图,并将其连接到urlpatterns
    import asyncio
    import json
    from django.http import HttpResponse
    
    async def async_sleep(request):
        await asyncio.sleep(1)
        return HttpResponse(json.dumps({'mode': 'async', 'time': 1).encode())
Run Code Online (Sandbox Code Playgroud)
  • 我在本地运行一个带有 Uvicorn 工作程序的 Gunicorn 服务器:
gunicorn MyService.asgi:application -k uvicorn.workers.UvicornWorker
[2022-01-26 14:37:14 +0100] [8732] [INFO] Starting …
Run Code Online (Sandbox Code Playgroud)

python django daphne asgi uvicorn

10
推荐指数
1
解决办法
4432
查看次数

Uvicorn 不随机处理某些请求

我们正在运行一个 Fastapi + Uvicorn Web 应用程序,使用 Gunicorn 作为进程管理器,使用 Nginx 作为反向代理服务器。对于大多数 I/O 操作(数据库调用、Rest api),应用程序都以异步模式运行。整个设置在 Ubuntu 16.04 上的 Docker 容器内运行。

\n

该设置在大多数情况下都有效,但有时它根本不处理请求,并且在 Nginx 端超时。我们还尝试将 Nginx 从设置中删除,并观察到在很长一段时间(例如 15 分钟后)后很少有请求得到处理。这是非常随机的,但通常在一小时内发生 2-3 次。

\n

下面是我们使用的gunicorn配置\xe2\x80\x93

\n
host = os.getenv("HOST", "0.0.0.0")\nport = os.getenv("PORT", "80")\n\n# Gunicorn config variables\nworkers = web_concurrency\nbind = f"{host}:{port}"\nkeepalive = 2\n\ntimeout = 60  \ngraceful_timeout = 30\nthreads = 2\nworker_tmp_dir = "/dev/shm"\n# Logging mechanism\ncapture_output = True\nloglevel = os.getenv("LOG_LEVEL", "debug") \n
Run Code Online (Sandbox Code Playgroud)\n

并用命令调用gunicornexec gunicorn -k uvicorn.workers.UvicornWorker -c "$GUNICORN_CONF" "$APP_MODULE"

\n

我们尝试了一些配置更改,例如 \xe2\x80\x93

\n
    \n
  1. 改变worker数量、worker超时
  2. \n …

nginx gunicorn python-asyncio fastapi uvicorn

9
推荐指数
0
解决办法
2460
查看次数

如何在像 hypercorn 或 uvicorn 这样的 ASGI 服务器上运行 Windows IIS?

我有使用Python编写的基于API的Web应用程序FastApi它采用UvicornHypercorn基于deployment.These都是ASGI服务器。有没有办法在此之上运行 IIS?

python iis asgi uvicorn hypercorn

9
推荐指数
1
解决办法
1330
查看次数

Uvicorn 和 Gunicorn+Uvicorn 有什么区别?

部署使用 Uvicorn 和Tiangolo 的 Gunicorn+Uvicorn dockerized 的FastAPI 应用程序有什么区别?为什么我的结果表明,仅使用 Uvicorn 进行部署时我会得到比 Gunicorn+Uvicorn 更好的结果?

当我在 Tiangolo 的文档中搜索时,它说:

您可以使用 Gunicorn 来管理 Uvicorn 并运行多个这些并发进程。这样,您可以获得最佳的并发性和并行性。

由此,我可以假设使用这个 Gunicorn 会得到更好的结果吗?

这是我使用 JMeter 进行的测试。我将脚本部署到 Google Cloud Run,结果如下:

使用 Python 和 Uvicorn:

在此处输入图片说明

使用 Tiangolo 的 Gunicorn+Uvicorn:

在此处输入图片说明

这是我的 Python Dockerfile (Uvicorn):

FROM python:3.8-slim-buster
RUN apt-get update --fix-missing
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y libgl1-mesa-dev python3-pip git
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip3 install -U setuptools
RUN pip3 install --upgrade pip
RUN pip3 install -r ./requirements.txt …
Run Code Online (Sandbox Code Playgroud)

gunicorn google-cloud-run fastapi uvicorn

9
推荐指数
1
解决办法
1031
查看次数

使用 pytest 进行测试时,如何使用 >= 2 的工作人员干净地终止 Uvicorn + FastAPI 应用程序

我有一个用 Uvicorn + FastAPI 编写的应用程序。我正在使用 PyTest 测试响应时间。

参考如何在使用 PyTest 进行测试时在后台启动 Uvicorn + FastAPI,我编写了测试。然而,当工人> = 2时,我在完成测试后发现应用程序进程处于活动状态。

我想在测试结束时干净地终止应用程序进程。

你有什么主意吗?

详情如下。

环境

图书馆

  • 快速 API == 0.68.0
  • 紫角兽 == 0.14.0
  • 请求==2.26.0
  • pytest==6.2.4

示例代码

python pytest fastapi uvicorn

9
推荐指数
1
解决办法
9872
查看次数

无法使用 Nginx 和 Uvicorn 连接到 websocket

我用 Django、Uvicorn、Nginx 和 Redis 构建了一个 docker 容器,并且正在使用 django-channels,但是当我运行它时,它说它无法连接到 websocket,这可以在浏览器控制台中看到:

WebSocket connection to 'ws://127.0.0.1:8080/ws/notifications/' failed

当我使用 Django 的 runserver 命令进行开发时,它工作正常,但当我包含 Nginx 和 Uvicorn 时,它就崩溃了。

入口点.sh:

gunicorn roomway.asgi:application --forwarded-allow-ips='*' --bind 0.0.0.0:8000 -k uvicorn.workers.UvicornWorker
Run Code Online (Sandbox Code Playgroud)

Nginx 配置:

upstream django {
    server app:8000;
}

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 8080;

    location /static {
        alias /vol/static;
    }

    location /ws/ {
        proxy_pass http://0.0.0.0:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location / {
        proxy_pass http://django;
        proxy_set_header Host $http_host; …
Run Code Online (Sandbox Code Playgroud)

django nginx websocket docker uvicorn

9
推荐指数
1
解决办法
1万
查看次数

在 FastAPI 中使用 `async def` 与 `def` 并测试阻塞调用

tl;dr

  1. 以下哪个选项是正确的工作流程fastapi
  2. 如何以编程方式测试调用是否真正被阻止(而不是从浏览器手动测试)?是否有对or 的压力测试扩展?uvicornfastapi

我在服务器中有许多端点fastapiuvicorn目前正在使用),它们对常规同步 Python 代码有长时间的阻塞调用。尽管有文档(https://fastapi.tiangolo.com/async/),我仍然不清楚我是否应该单独使用defasync def混合我的功能。

据我了解,我有三个选择,假设:

def some_long_running_sync_function():
  ...
Run Code Online (Sandbox Code Playgroud)

选项 1 - 始终def仅用于端点

@app.get("route/to/endpoint")
def endpoint_1:
  some_long_running_sync_function()


@app.post("route/to/another/endpoint")
def endpoint_2:
  ...
Run Code Online (Sandbox Code Playgroud)

选项 2 - 始终async def仅使用并在执行器中运行阻塞同步代码

import asyncio


@app.get("route/to/endpoint")
async def endpoint_1:
  loop = asyncio.get_event_loop()
  await loop.run_in_executor(None, some_long_running_sync_function)


@app.post("route/to/another/endpoint")
async def endpoint_2:
  ...
Run Code Online (Sandbox Code Playgroud)

选项 3 - 混合搭配defasync def基于底层调用

import asyncio


@app.get("route/to/endpoint")
def endpoint_1: …
Run Code Online (Sandbox Code Playgroud)

python-asyncio fastapi uvicorn

9
推荐指数
1
解决办法
9491
查看次数

FastAPI:ModuleNotFoundError:没有名为“uvicorn”的模块

我承认我gunicorn以前从未使用过。当我运行命令时gunicorn main:app -k uvicorn.workers.UvicornWorker出现错误:

Error: class uri 'uvicorn.workers.UvicornWorker' invalid or not found: 

[Traceback (most recent call last):
  File "/Users/AdnanAhmad/Data/anaconda3/lib/python3.7/site-packages/gunicorn/util.py", line 135, in load_class
    mod = import_module('.'.join(components))
  File "/Users/X/Data/anaconda3/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, …
Run Code Online (Sandbox Code Playgroud)

python gunicorn fastapi uvicorn

8
推荐指数
1
解决办法
6万
查看次数