Python模块Uvicorn实战

 更新时间:2025年04月01日 16:34:52   作者:ghostwritten  
这篇文章主要介绍了Python模块Uvicorn实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Uvicorn 是一个高性能的 ASGI 实现。它是构建和运行 Python 基于 ASGI 的 Web 和实时服务器应用的理想选择。它特别适合于构建高性能、实时的应用,如 WebSocket、HTTP/2、GraphQL API等。本文将通过一些实战例子,教你如何使用 Uvicorn 构建和运行应用。

1. 介绍和安装

1.1 介绍

Uvicorn 是一个基于 Python 的轻量级 ASGI 服务器,以 uvloop 和 httptools 为核心,以提供极速和高效。

1.2 安装

使用 pip 安装:

pip install uvicorn

如果需要最高性能,建议安装以下选项:

pip install uvicorn[standard]

该包含 uvloop 和 httptools,并提供完善的日志和进程以及完整的处理能力。

2. 创建基础应用

2.1 简单的 HTTP 应用

创建一个文件,名为 app.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

使用 Uvicorn 运行该应用:

uvicorn app:app --host 0.0.0.0 --port 8000 --reload

2.2 添加日志

实际应用中,日志很重要。使用 --log-level 可以控制日志输出:

uvicorn app:app --log-level debug

定制日志格式:

uvicorn app:app --log-config logging.yaml

一个例子 logging.yaml

version: 1
formatters:
  default:
    format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
  console:
    class: logging.StreamHandler
    formatter: default
loggers:
  uvicorn:
    handlers: [console]
    level: INFO
root:
  handlers: [console]
  level: INFO

3. 实现高级功能

3.1 支持 WebSocket

在添加 WebSocket 支持时,可以使用 FastAPI 的高性能功能。

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message text was: {data}")

运行该应用,并使用浏览器接入 WebSocket。

3.2 优化运行性能

在高流量场景中,使用 --workers 可以超现行处理。

uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4

举例:指定服务器使用 uvloop :

uvicorn app:app --loop uvloop

4. Nginx 配置反向代理

在生产环境中,使用 Nginx 作为反向代理,可以提供以下优势:

  • SSL 支持
  • 更好的负载均衡能力
  • 请求过滤与缓存

以下是具体配置步骤:

4.1 安装与配置 Nginx

  • 安装 Nginx

在基于 Debian 的系统中:

sudo apt update
sudo apt install nginx

在基于 Red Hat 的系统中:

sudo yum install nginx
  • 编辑 Nginx 配置文件

创建或修改一个 Nginx 站点配置文件,例如 /etc/nginx/sites-available/uvicorn

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    error_log /var/log/nginx/uvicorn_error.log;
    access_log /var/log/nginx/uvicorn_access.log;
}
  • 启用站点配置

在基于 Debian 的系统中:

sudo ln -s /etc/nginx/sites-available/uvicorn /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

在基于 Red Hat 的系统中,直接编辑 /etc/nginx/nginx.conf 添加上述配置,然后重新加载 Nginx:

sudo nginx -t
sudo systemctl reload nginx

4.2 启用 SSL 支持

使用 Let’s Encrypt 为域名启用 HTTPS 支持:

  • 安装 Certbot:
sudo apt install certbot python3-certbot-nginx
  • 自动配置 HTTPS:
sudo certbot --nginx -d example.com

完成后,Nginx 将自动更新为支持 HTTPS 的配置。

  • 定期更新证书:

Certbot 会自动添加定期更新任务。如果需要手动测试:

sudo certbot renew --dry-run

4.3 性能优化建议

  • 启用 HTTP/2 支持

在 listen 指令中添加 http2

listen 443 ssl http2;
  • 启用 Gzip 压缩

在 Nginx 配置中启用 Gzip 压缩:

gzip on;
gzip_types text/plain application/json application/javascript text/css;
  • 优化缓冲设置

调整 proxy_buffer_size 和 proxy_buffers

proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

5. 常见问题与解决方案

5.1 高并发问题

在高并发场景下,Uvicorn 可能会因为 CPU 饱和而表现出瓶颈。解决方案包括:

  • 增加 --workers 参数以启用多进程。
  • 使用负载均衡器(如 Nginx 或 HAProxy)分配请求。

5.2 WebSocket 超时

WebSocket 可能在高流量时出现超时问题。可以通过调整 Uvicorn 的 --timeout-keep-alive 参数增加连接存活时间:

uvicorn app:app --timeout-keep-alive 120

5.3 日志不完整

日志在高负载时可能出现丢失情况。解决方法是使用独立日志管理器(如 ELK 或 Fluentd)集中处理日志。

6. 总结

Uvicorn 是构建现代高性能 Python 应用的利器。通过灵活的配置和良好的性能优化,它可以轻松应对从开发到生产的各种场景。在这篇文章中,我们涵盖了 Uvicorn 的安装、基础功能、性能优化以及部署技巧。希望这些内容能帮助你更高效地使用 Uvicorn。

到此这篇关于Python模块Uvicorn实战的文章就介绍到这了,更多相关Python Uvicorn内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python查看某个包的当前安装版本及最新版本的五种方法

    python查看某个包的当前安装版本及最新版本的五种方法

    这篇文章主要介绍了5种查看Python包最新版本的方法,包括使用pip的--outdated参数、pipsearch命令(已被弃用)、pipindexversions命令、pypi-simple工具和在Python脚本中使用pip,需要的朋友可以参考下
    2025-01-01
  • python 用opencv实现霍夫线变换

    python 用opencv实现霍夫线变换

    这篇文章主要介绍了python 如何用opencv实现霍夫线变换,帮助大家更好的理解和使用python处理图片,感兴趣的朋友可以了解下
    2020-11-11
  • 简介二分查找算法与相关的Python实现示例

    简介二分查找算法与相关的Python实现示例

    这篇文章主要介绍了二分查找算法与相关的Python实现示例,Binary Search同时也是算法学习当中最基础的知识,需要的朋友可以参考下
    2015-08-08
  • Python中hash()函数之哈希值的奥秘详解

    Python中hash()函数之哈希值的奥秘详解

    hash()是Python 中的一个内置函数,用于计算对象的哈希值,哈希值是一个整数,用于唯一标识对象,下面这篇文章主要给大家介绍了关于Python中hash()函数之哈希值奥秘的相关资料,需要的朋友可以参考下
    2024-06-06
  • python实现控制COM口的示例

    python实现控制COM口的示例

    今天小编就为大家分享一篇python实现控制COM口的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python实现输出程序执行进度百分比的方法

    Python实现输出程序执行进度百分比的方法

    这篇文章主要介绍了Python实现输出程序执行进度百分比的方法,涉及Python数值运算与系统输出相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • python中类变量与成员变量的使用注意点总结

    python中类变量与成员变量的使用注意点总结

    python 的类中主要会使用的两种变量:类变量与成员变量。类变量是类所有实例化对象共有的,而成员变量是每个实例化对象自身特有的。下面这篇文章主要给大家介绍了在python中类变量与成员变量的一些使用注意点,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • python中使用requests设置代理服务器

    python中使用requests设置代理服务器

    文章介绍了代理服务器的工作原理和使用方法,包括代理的概念、代理服务器的作用、如何在Python中设置代理以及代理的匿名度分类
    2024-11-11
  • pymysql 开启调试模式的实现

    pymysql 开启调试模式的实现

    这篇文章主要介绍了pymysql 开启调试模式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • python geopandas读取、创建shapefile文件的方法

    python geopandas读取、创建shapefile文件的方法

    shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature Class),主要包括点(point)、线(polyline)和多边形(polygon),本文重点给大家介绍python geopandas读取、创建shapefile文件的方法,需要的朋友参考下吧
    2021-06-06

最新评论