云计算百科
云计算领域专业知识百科平台

Python uvicorn库:一款高性能的ASGI服务器

e83d9802a42649c35620d9dc1a9153d3.png

更多Python学习内容:ipengtao.com

在构建现代Web应用程序时,性能和并发能力是重要的考量因素。传统的WSGI服务器已无法满足异步Web框架的需求,而ASGI(Asynchronous Server Gateway Interface)成为新一代Web服务器接口的标准。Uvicorn 是一个快速、轻量级的ASGI服务器,支持异步Web框架(如FastAPI和Starlette)以及HTTP/2和WebSocket。Uvicorn 基于 uvloop 和 httptools 构建,具有高性能、易用性和灵活性的特点。

安装

要开始使用 Uvicorn,首先需要安装它。

可以通过 pip 安装:

pip install uvicorn

为了获得最佳性能,可以安装带Cython优化的版本:

pip install "uvicorn[standard]"

安装完成后,可以通过以下命令验证安装是否成功:

uvicorn –version

主要功能

  • 支持ASGI协议:完全兼容ASGI标准,可以运行异步和同步的Web应用。

  • 高性能:基于 uvloop 和 httptools,支持高吞吐量和低延迟。

  • 支持HTTP/2和WebSocket:满足现代Web应用的实时通信需求。

  • 热重载:开发模式下支持代码热重载,提升开发效率。

  • 灵活的配置:通过命令行参数或Python代码自定义运行选项。

这些功能使 Uvicorn 成为构建高性能Web应用的理想选择。

基础用法

运行简单的ASGI应用

以下是一个最简单的ASGI应用示例:

async def app(scope, receive, send):
    assert scope['type'] == 'http'
    response = b"Hello, Uvicorn!"
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [(b'content-type', b'text/plain')],
    })
    await send({
        'type': 'http.response.body',
        'body': response,
    })

使用 Uvicorn 运行该应用:

uvicorn app:app –host 127.0.0.1 –port 8000

打开浏览器访问 http://127.0.0.1:8000,将显示 “Hello, Uvicorn!”。

集成异步Web框架

Uvicorn 常与异步Web框架(如FastAPI)一起使用。

以下是一个集成FastAPI的示例:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Welcome to Uvicorn with FastAPI!"}

运行该应用:

uvicorn main:app –reload

–reload 参数启用代码热重载功能,每次修改代码后服务器将自动重启。

自定义运行参数

Uvicorn 支持通过命令行或Python代码自定义运行参数。

例如,可以启用HTTP/2支持或设置工作线程数:

uvicorn main:app –host 0.0.0.0 –port 8080 –http h11 –workers 4

也可以通过Python脚本运行:

import uvicorn

if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=8080, workers=4)

进阶用法

日志配置

Uvicorn 提供了灵活的日志配置选项,可以通过 –log-level 参数设置日志级别:

uvicorn main:app –log-level debug

如果需要自定义日志格式,可以在Python脚本中配置:

import logging
import uvicorn

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, format="%(asctime)s – %(message)s")
    uvicorn.run("main:app", log_level="info")

启用SSL支持

Uvicorn 支持HTTPS,通过指定SSL证书和私钥即可启用:

uvicorn main:app –ssl-keyfile key.pem –ssl-certfile cert.pem

这在需要保护敏感数据的场景中非常有用。

使用自定义中间件

Uvicorn 支持自定义中间件来扩展ASGI应用的功能。

例如,可以创建一个简单的日志中间件:

class LogMiddleware:
    def __init__(self, app):
        self.app = app

    async def __call__(self, scope, receive, send):
        print(f"New request: {scope['path']}")
        await self.app(scope, receive, send)

async def app(scope, receive, send):
    assert scope['type'] == 'http'
    response = b"Hello, Middleware!"
    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [(b'content-type', b'text/plain')],
    })
    await send({
        'type': 'http.response.body',
        'body': response,
    })

app = LogMiddleware(app)

运行上述代码后,服务器将记录每个请求的路径。

多进程模式

在高并发场景下,可以通过 –workers 参数启用多进程模式,以提升性能:

uvicorn main:app –workers 4

每个进程将独立处理请求,有助于充分利用多核CPU。

实际应用

构建实时聊天应用

以下是一个简单的WebSocket聊天应用:

from fastapi import FastAPI, WebSocket

app = FastAPI()

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

运行该应用并使用WebSocket客户端测试,即可实现实时消息交互。

开发高性能API服务

通过 Uvicorn 和 FastAPI,可以快速构建一个高性能的RESTful API:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

运行后可以通过 curl 或其他工具测试:

curl "http://127.0.0.1:8000/items/42?q=test"

返回结果:

{
  "item_id": 42,
  "q": "test"
}

部署机器学习模型

Uvicorn 常用于部署机器学习模型。

以下示例展示了如何将一个预训练的模型暴露为API:

from fastapi import FastAPI
import joblib

app = FastAPI()
model = joblib.load("model.pkl")

@app.post("/predict")
async def predict(features: dict):
    prediction = model.predict([list(features.values())])
    return {"prediction": prediction[0]}

通过 Uvicorn 运行该服务,即可将机器学习模型集成到应用中。

总结

Uvicorn 是一个高性能的ASGI服务器,专为支持现代异步Web框架而设计,如FastAPI和Starlette。它基于 uvloop 和 httptools,具有快速响应、高并发处理能力以及对HTTP/2和WebSocket的原生支持。作为轻量级服务器,Uvicorn 提供了灵活的配置选项,包括多进程模式、SSL支持和自定义日志配置等,同时支持代码热重载,大大提高了开发效率。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


我们还为大家准备了Python资料,感兴趣的小伙伴快来找我领取一起交流学习哦!

63a82ea4d9dd466bdc15f241649ee644.jpeg

往期推荐

Python基础学习常见的100个问题.pdf(附答案)

Python办公自动化完全指南(免费PDF)

Python Web 开发常见的100个问题.PDF

Beautiful Soup快速上手指南,从入门到精通(PDF下载)

124个Python案例,完整源代码!

80个Python数据分析必备实战案例.pdf(附代码),完全开放下载

120道Python面试题.pdf ,完全版开放下载

全网最全 Pandas的入门与高级教程全集,都在这里了!(PDF下载)

点击下方“阅读原文”查看更多

赞(0)
未经允许不得转载:网硕互联帮助中心 » Python uvicorn库:一款高性能的ASGI服务器
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!