【Python】Uvicorn:Python 异步 ASGI 服务器详解

news2024/10/2 7:50:17

在这里插入图片描述

Uvicorn 是一个为 Python 设计的 ASGI(异步服务器网关接口)Web 服务器。它填补了 Python 在异步框架中缺乏一个最小化低层次服务器/应用接口的空白。Uvicorn 支持 HTTP/1.1 和 WebSockets,是构建现代异步Web应用的强大工具。

在这里插入图片描述
华丽的分割线

⭕️宇宙起点

    • 🎬 什么是 Uvicorn?
    • 🔨 Uvicorn 的主要功能和特性
    • 📦 Uvicorn 的常用启动参数
    • ♨️ 示例:使用 `uvicorn.run` 启动 ASGI 应用
    • ⚙️ 运行 Uvicorn 的高级配置
    • 🔧 使用 Gunicorn 部署 Uvicorn
    • 📥 下载地址
    • 💬 结语
      • 📒 参考文献


标题1

🎬 什么是 Uvicorn?

在这里插入图片描述

Uvicorn 是一个轻量级、高性能的 ASGI(Asynchronous Server Gateway Interface) 服务器,专为支持 Python 异步框架(如 FastAPI 和 Starlette)而设计。与传统的 WSGI 服务器(如 Gunicorn)不同,Uvicorn 旨在提供对异步 Web 框架的完全支持,并在性能和灵活性方面进行了大量优化。


标题2

🔨 Uvicorn 的主要功能和特性

  • 高性能:Uvicorn 使用 uvloop 作为默认的事件循环和 httptools 进行 HTTP 解析,因此比传统的 Python 服务器更快。
  • 支持多种协议:支持 HTTP 和 WebSocket 协议,并可配置 ASGI 2 或 ASGI 3 接口。
  • 配置灵活:支持通过命令行参数、环境变量或配置文件进行详细的服务器配置。

标题3

📦 Uvicorn 的常用启动参数

在使用 Uvicorn 启动 ASGI 应用时,通常通过命令行传递各种参数以控制其行为。下面列出了几个常用的启动参数及其用途:

参数作用示例
--host指定绑定的主机地址--host 127.0.0.1
--port指定端口号--port 8000
--workers指定工作进程数--workers 4
--reload启用自动重载,在开发时自动检测文件变动并重启服务器--reload
--log-level日志等级(infodebugerror--log-level debug
--ssl-keyfileSSL 密钥文件路径--ssl-keyfile ./path/to/key.pem
--ssl-certfileSSL 证书文件路径--ssl-certfile ./path/to/cert.pem
--backlog设置连接请求的最大等待队列数--backlog 2048
--limit-max-requests限制单个进程在重启前可处理的最大请求数--limit-max-requests 1000

这些参数可以灵活地组合使用,根据需要配置 Uvicorn 的运行行为。特别是对于生产环境,可以搭配 --workers 参数来启动多个进程,提高并发处理能力。


标题4

♨️ 示例:使用 uvicorn.run 启动 ASGI 应用

Uvicorn 既可以从命令行启动,也可以通过 Python 代码进行启动。以下是几种不同的启动方式:

1)使用 uvicorn.run() 启动

import uvicorn

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

if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=5000, log_level="info")

2)使用 ConfigServer 实例

当需要更细粒度的控制时,可以使用 ConfigServer 实例:

import uvicorn

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

if __name__ == "__main__":
    config = uvicorn.Config("main:app", host="127.0.0.1", port=5000, log_level="info")
    server = uvicorn.Server(config)
    server.run()

3)异步环境中启动 Uvicorn

如果要在已有的异步事件循环中启动,可以使用 uvicorn.Server.serve()

import asyncio
import uvicorn

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

async def main():
    config = uvicorn.Config("main:app", host="127.0.0.1", port=5000, log_level="info")
    server = uvicorn.Server(config)
    await server.serve()

if __name__ == "__main__":
    asyncio.run(main())

标题5

⚙️ 运行 Uvicorn 的高级配置

Uvicorn 提供了多种高级配置选项来满足不同应用的需求,包括 HTTP 流量控制、SSL 设置、资源限制等。常用配置如下:

配置选项描述默认值
--limit-concurrency限制最大并发连接数,超出时返回 HTTP 503None
--timeout-keep-aliveKeep-Alive 超时时间,超过该时间未收到请求则断开连接5
--timeout-graceful-shutdown优雅关闭服务器的最大等待时间None
--ssl-versionSSL 协议版本(参考标准库 ssl 模块)17
--log-config日志配置文件路径None
--ws-ping-intervalWebSocket 心跳包发送间隔时间20.0
--ws-ping-timeoutWebSocket 心跳包超时时间20.0

这些参数可以在开发和生产环境中进行不同的调整,以提升服务器的响应速度和安全性。


标题6

🔧 使用 Gunicorn 部署 Uvicorn

在生产环境中,通常推荐使用 Gunicorn 搭配 Uvicorn 的工作进程模式来部署。这样可以充分利用多进程的优势,并且享有 Gunicorn 稳定的进程管理功能。

gunicorn -w 4 -k uvicorn.workers.UvicornWorker example:app

此命令会启动 4 个工作进程,并使用 UvicornWorker 管理 ASGI 应用的多进程环境。


标题7

📥 下载地址


Uvicorn 最新版 下载地址


标题8

💬 结语

Uvicorn 是一个功能强大、配置灵活且易于使用的异步 Web 服务器,非常适合现代 Python 异步框架的开发和部署。通过合理配置和结合 Gunicorn,可以充分利用其高性能和稳定性来处理各种 Web 请求。

📒 参考文献

  • Uvicorn 官网
  • Uvicorn GitHub仓库

TheEnd


在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2184030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++网络编程之IP地址和端口

概述 IP地址和端口共同定义了网络通信中的源和目标。IP地址负责将数据从源设备正确地传输到目标设备,而端口则确保在目标设备上数据被交付到正确的应用或服务。因此,在网络编程中,IP地址和端口是密不可分的两个概念,共同构成了网络…

Why RTSP?RTSP播放器优势探究

RTSP优势探究 好多开发者搞不清楚,低延迟的传输,到底是走RTMP、WebRTC还是RTSP?如果走RTSP,RTSP播放器的优势有哪些?能否达到期望的延迟?答案是肯定的,废话不多说,上效果图&#xf…

Power apps:一次提交多项申请

1、添加一个Form,导入sharepoint列表,添加确认,继续,取消按钮 2、在页面的onvisible属性中添加 Set(applynumber,Last(付款申请表).申请编号1); #定义一个申请编号变量,每次申请,就将列表最后一个…

医疗陪诊APP开发实战:从互联网医院系统源码开始

本文将从互联网医院系统源码出发,深入探讨医疗陪诊APP的开发实战。 一、从互联网医院系统源码入手 开发医疗陪诊APP的基础在于互联网医院系统的源码。互联网医院系统通常包括以下几个模块: 1.用户管理:用户注册、登录、信息管理等功能。 …

C++继承的三种方式[ACCESS]

C继承的定义 两个类的继承关系在派生类中声明,派生类定义使用以下语法: class DerivedClass: [ACCESS] BaseClass{ /…/ }; 冒号(:)后的[ACCESS]是继承的最高权限级别符,可以是以下三个值(存取权限级别&am…

fpga系列 硬件(时序收敛):触发器建立时间(setuptime)

触发器 电平触发、边沿触发和脉冲触发是三种主要的触发形式。always (posedge clk or negedge rst_n) 是一个典型的 Verilog 语句,用于定义一个带复位的触发器。D触发器是一种基本的数字存储元件,主要用于数据存储和时序控制。 D触发器的建立时间和保持…

Zabbix自动发现SNMP主机

前言 利用Zabbix监控DELL R740主机硬件,监控通过自动发现主机,链接SNMP监控模板 一、配置自动发现 自动发现脚本 cat discovery_host.pyfrom os.path import abspath, dirname, join import json import sysreload(sys) sys.setdefaultencoding(utf-8…

【2024】前端学习笔记11-网页布局-弹性布局flex

学习笔记 网页布局弹性布局:flex案例:flex布局案例 网页布局 在页面布局中,display属性用于设置一个元素的显示方式。它可以指定元素是作为块级元素、内联元素还是充当表格元素显示。 display的常见属性值: block:将…

前端——Ajax和jQuery

一、Ajax Ajax即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML), 通过 JS 异步的向服务器发送请 求并接收响应数据。 同步访问:当客户端向服务器发送请求时,服务器在处理的过程中,浏览器…

AutoGen实现多代理-Planning_and_Stock_Report_Generation(六)

1. 案例背景 本节内容是构建Agent组,通过广播模式,实现管理者对agent工作流的管理。本实验链接:传送门 2. 代码实践 2.1 环境设置 llm_config{"model": "gpt-4-turbo"}# 工作任务描述 task "Write a blogpost a…

【CSS3】css开篇基础(1)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

【树莓派系列】树莓派首次开机配置

树莓派首次开机配置 文章目录 树莓派首次开机配置1.镜像烧录2.开启串口调试1.无屏幕2.有屏幕3.串口登录系统 3.配置网络VNC与SSH的区别 4.更新vim5.固定IP地址6.开启SSH,网络登录开发板7.xrdp图形化登录开发板XRDP与VNC区别8.更新国内下载镜像源9.vscode连接开发板1…

C语言 | Leetcode C语言题解之第450题删除二叉搜索树中的节点

题目: 题解: struct TreeNode* deleteNode(struct TreeNode* root, int key){struct TreeNode *cur root, *curParent NULL;while (cur && cur->val ! key) {curParent cur;if (cur->val > key) {cur cur->left;} else {cur c…

OpenAi FunctionCalling 案例详解

源码详细讲解 pdf 及教学视频下载链接:点击这里下载 FunctionCalling的单一函数调用 天气预报查询(今天长沙的天气如何?) import json import requests from openai import OpenAIclient OpenAI()location "长沙"…

`git restore` 和 `git checkout` 用于丢弃工作区的改动, `git switch` 和 `git checkout` 用来切换分支

git restore 和 git checkout 都可以用于丢弃工作区的改动 但它们有一些区别,尤其是在 Git 2.23 引入了新的命令后。 主要区别 git checkout 是一个多用途命令: 它用于切换分支。它还可以用于恢复工作区中特定文件的更改。由于功能过于复杂&#xff0c…

Cortex微控制器软件接口标准(CMSIS)

Cortex微控制器软件接口标准 目前,软件开发已经是嵌入式系统行业公认的主要开发成本,通过将所有Cortex-M芯片供应商产品的软件接口标准化,能有效降低这一成本,尤其是进行新产品开发或者将现有项目或软件移植到基于不同厂商MCU的产…

Golang | Leetcode Golang题解之第450题删除二叉搜索树的节点

题目: 题解: func deleteNode(root *TreeNode, key int) *TreeNode {var cur, curParent *TreeNode root, nilfor cur ! nil && cur.Val ! key {curParent curif cur.Val > key {cur cur.Left} else {cur cur.Right}}if cur nil {retur…

回首往事,感受change

今早,我收到了CSDN发来的消息,当我看了内容才发现,我不知不觉已经在CSDN里面创作了730天(2年)也是个非常值得纪念的日子。 今天,我来回顾一下我的以往,感受一下我的成长与变化。 梦的开始 大家…

【Python报错已解决】 Failed building wheel for opencv-python-headless

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

2024多模态大模型发展调研

随着生成式大语言模型应用的日益广泛,其输入输出模态受限的问题日益凸显,成为制约技术进一步发展的瓶颈。为突破这一局限,本文聚焦于研究多模态信息的协同交互策略,旨在探索一种能够统一理解与生成的多模态模型构建方法。在此基础…