我正在使用 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,并且在幕后似乎使用websockets。websockets.connect默认情况下使用 20 秒的 aping_interval和ping_timeout,但我不知道 FastAPI 中是否使用了它。
我想将一个简单的 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
非常感谢帮助!
问题简述
我已将我的项目从 Django 2.2 迁移到 Django 3.2,现在我想开始使用异步视图的可能性。我创建了一个异步视图,设置了 asgi 配置,并使用 Uvicorn 工作程序运行 Gunicorn。当该服务器同时有 10 个用户时,他们会被同步服务。我需要配置什么才能为 10 个并发用户提供异步视图?
详细问题
这是我到目前为止在本地环境中所做的:
gunicorn并uvicorn通过 pipasgi.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)
gunicorn MyService.asgi:application -k uvicorn.workers.UvicornWorker
[2022-01-26 14:37:14 +0100] [8732] [INFO] Starting …Run Code Online (Sandbox Code Playgroud) 我们正在运行一个 Fastapi + Uvicorn Web 应用程序,使用 Gunicorn 作为进程管理器,使用 Nginx 作为反向代理服务器。对于大多数 I/O 操作(数据库调用、Rest api),应用程序都以异步模式运行。整个设置在 Ubuntu 16.04 上的 Docker 容器内运行。
\n该设置在大多数情况下都有效,但有时它根本不处理请求,并且在 Nginx 端超时。我们还尝试将 Nginx 从设置中删除,并观察到在很长一段时间(例如 15 分钟后)后很少有请求得到处理。这是非常随机的,但通常在一小时内发生 2-3 次。
\n下面是我们使用的gunicorn配置\xe2\x80\x93
\nhost = 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") \nRun Code Online (Sandbox Code Playgroud)\n并用命令调用gunicornexec gunicorn -k uvicorn.workers.UvicornWorker -c "$GUNICORN_CONF" "$APP_MODULE"
我们尝试了一些配置更改,例如 \xe2\x80\x93
\n部署使用 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) 我有一个用 Uvicorn + FastAPI 编写的应用程序。我正在使用 PyTest 测试响应时间。
参考如何在使用 PyTest 进行测试时在后台启动 Uvicorn + FastAPI,我编写了测试。然而,当工人> = 2时,我在完成测试后发现应用程序进程处于活动状态。
我想在测试结束时干净地终止应用程序进程。
你有什么主意吗?
详情如下。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def hello_world():
return "hello world"
Run Code Online (Sandbox Code Playgroud)
from multiprocessing import Process
import pytest
import requests
import time
import uvicorn
HOST = "127.0.0.1"
PORT = 8765
WORKERS = 1
def run_server(host: str, port: …Run Code Online (Sandbox Code Playgroud)我用 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) tl;drfastapi?uvicornfastapi我在服务器中有许多端点fastapi(uvicorn目前正在使用),它们对常规同步 Python 代码有长时间的阻塞调用。尽管有文档(https://fastapi.tiangolo.com/async/),我仍然不清楚我是否应该单独使用def或async def混合我的功能。
据我了解,我有三个选择,假设:
def some_long_running_sync_function():
...
Run Code Online (Sandbox Code Playgroud)
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)
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)
def并async def基于底层调用import asyncio
@app.get("route/to/endpoint")
def endpoint_1: …Run Code Online (Sandbox Code Playgroud) 我承认我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)