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

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


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

Uvicorn 是一个轻量级、高性能的 ASGI(Asynchronous Server Gateway Interface) 服务器,专为支持 Python 异步框架(如 FastAPI 和 Starlette)而设计。与传统的 WSGI 服务器(如 Gunicorn)不同,Uvicorn 旨在提供对异步 Web 框架的完全支持,并在性能和灵活性方面进行了大量优化。
![]()
🔨 Uvicorn 的主要功能和特性
- 高性能:Uvicorn 使用
uvloop作为默认的事件循环和httptools进行 HTTP 解析,因此比传统的 Python 服务器更快。 - 支持多种协议:支持 HTTP 和 WebSocket 协议,并可配置 ASGI 2 或 ASGI 3 接口。
- 配置灵活:支持通过命令行参数、环境变量或配置文件进行详细的服务器配置。
![]()
📦 Uvicorn 的常用启动参数
在使用 Uvicorn 启动 ASGI 应用时,通常通过命令行传递各种参数以控制其行为。下面列出了几个常用的启动参数及其用途:
| 参数 | 作用 | 示例 |
|---|---|---|
--host | 指定绑定的主机地址 | --host 127.0.0.1 |
--port | 指定端口号 | --port 8000 |
--workers | 指定工作进程数 | --workers 4 |
--reload | 启用自动重载,在开发时自动检测文件变动并重启服务器 | --reload |
--log-level | 日志等级(info、debug、error) | --log-level debug |
--ssl-keyfile | SSL 密钥文件路径 | --ssl-keyfile ./path/to/key.pem |
--ssl-certfile | SSL 证书文件路径 | --ssl-certfile ./path/to/cert.pem |
--backlog | 设置连接请求的最大等待队列数 | --backlog 2048 |
--limit-max-requests | 限制单个进程在重启前可处理的最大请求数 | --limit-max-requests 1000 |
这些参数可以灵活地组合使用,根据需要配置 Uvicorn 的运行行为。特别是对于生产环境,可以搭配 --workers 参数来启动多个进程,提高并发处理能力。
![]()
♨️ 示例:使用 uvicorn.run 启动 ASGI 应用
Uvicorn 既可以从命令行启动,也可以通过 Python 代码进行启动。以下是几种不同的启动方式:
1)使用 uvicorn.run() 启动
import uvicornasync 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)使用 Config 和 Server 实例
当需要更细粒度的控制时,可以使用 Config 和 Server 实例:
import uvicornasync 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 uvicornasync 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())
![]()
⚙️ 运行 Uvicorn 的高级配置
Uvicorn 提供了多种高级配置选项来满足不同应用的需求,包括 HTTP 流量控制、SSL 设置、资源限制等。常用配置如下:
| 配置选项 | 描述 | 默认值 |
|---|---|---|
--limit-concurrency | 限制最大并发连接数,超出时返回 HTTP 503 | None |
--timeout-keep-alive | Keep-Alive 超时时间,超过该时间未收到请求则断开连接 | 5 |
--timeout-graceful-shutdown | 优雅关闭服务器的最大等待时间 | None |
--ssl-version | SSL 协议版本(参考标准库 ssl 模块) | 17 |
--log-config | 日志配置文件路径 | None |
--ws-ping-interval | WebSocket 心跳包发送间隔时间 | 20.0 |
--ws-ping-timeout | WebSocket 心跳包超时时间 | 20.0 |
这些参数可以在开发和生产环境中进行不同的调整,以提升服务器的响应速度和安全性。
![]()
🔧 使用 Gunicorn 部署 Uvicorn
在生产环境中,通常推荐使用 Gunicorn 搭配 Uvicorn 的工作进程模式来部署。这样可以充分利用多进程的优势,并且享有 Gunicorn 稳定的进程管理功能。
gunicorn -w 4 -k uvicorn.workers.UvicornWorker example:app
此命令会启动 4 个工作进程,并使用 UvicornWorker 管理 ASGI 应用的多进程环境。
![]()
📥 下载地址
Uvicorn 最新版 下载地址
![]()
💬 结语
Uvicorn 是一个功能强大、配置灵活且易于使用的异步 Web 服务器,非常适合现代 Python 异步框架的开发和部署。通过合理配置和结合 Gunicorn,可以充分利用其高性能和稳定性来处理各种 Web 请求。
📒 参考文献
- Uvicorn 官网
- Uvicorn GitHub仓库



相关文章:
【Python】Uvicorn:Python 异步 ASGI 服务器详解
Uvicorn 是一个为 Python 设计的 ASGI(异步服务器网关接口)Web 服务器。它填补了 Python 在异步框架中缺乏一个最小化低层次服务器/应用接口的空白。Uvicorn 支持 HTTP/1.1 和 WebSockets,是构建现代异步Web应用的强大工具。 ⭕️宇宙起点 &a…...
类型转换【C++提升】(隐式转换、显式转换、自定义转换、转换构造函数、转换运算符重载......你想知道的全都有)
更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: C系列语法知识_Stark、的博客-CSDN博客 座右铭:梦想是一盏明灯,照亮我们前行的路,无论风雨多大,我们都要坚持不懈。 一…...
微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台
目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 小程序端…...
【AI大模型】使用Embedding API
一、使用OpenAI API 目前GPT embedding mode有三种,性能如下所示: 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…...
面试速通宝典——11
188. 总结static的应用和作用 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函…...
python:reportlab 将多个图片合并成一个PDF文件
承上一篇:java:pdfbox 3.0 去除扫描版PDF中文本水印 # 导出扫描版PDF文件中每页的图片文件 java -jar pdfbox-app-3.0.3.jar export:images -prefixtest -i your_book.pdf 导出 Writing image: test-1.jpg Writing image: test-2.jpg Writing image: t…...
决策树:机器学习中的强大工具
什么是决策树? 决策树是一种通过树状结构进行决策的模型。它的每个节点代表一个特征(或属性),每个分支代表特征的可能值,而每个叶子节点则代表最终的决策结果或分类。想象一下,在选择晚餐时,你…...
平面电磁波(解麦克斯韦方程)电场相位是复数的积分常数,电场矢量每个分量都有一个相位。磁场相位和电场一样,这是因为无损介质中实数的波阻抗
注意无源代表你立方程那个点xyzt处没有源,电场磁场也是这个点的。 j电流面密度,电流除以单位面积,ρ电荷体密度,电荷除以单位体积。 j方程组有16个未知数,每个矢量有三个xyz分量,即三个未知数,…...
复习HTML(进阶)
前言 上一篇的最后我介绍了在表单中,上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…...
Qt 每日面试题 -7
61、如何安全的在另外一个线程中调用QObject对象的接口 QObject被设计成在一个单线程中创建与使用,因此,在一个线程中创建一个对象,而在另外的线程中调用它的函数,这样的行为不能保证工作良好。使用信号槽的队列连接或者QT的反射…...
《计算机原理与系统结构》学习系列——计算机的算数运算(下)
系列文章目录 目录 浮点数的表示和运算浮点数的表示浮点数的规格化浮点数标准IEEE754浮点数表示范围浮点数的转换浮点数的运算浮点数加法浮点数加法的硬件实现 精度浮点乘法浮点运算硬件 MIPS中的浮点指令 浮点数的表示和运算 浮点数的表示 表达非整型的数 可以表达很小和很大…...
二叉树进阶学习——从前序和中序遍历序列构造二叉树
1.题目解析 题目来源:105.从前序与中序遍历序列构造二叉树——力扣 测试用例 2.算法原理 首先要了解一个概念 前序遍历:按照 根节点->左子树->右子树的顺序遍历二叉树 中序遍历:按照 左子树->根节点->右子树的顺序遍历二叉树 题目…...
【数据分享】2000—2023年我国省市县三级逐年植被覆盖度(FVC)数据(Shp/Excel格式)
之前我们分享过2000—2023年逐月植被覆盖度(FVC)栅格数据(可查看之前的文章获悉详情)和Excel和Shp格式的省市县三级逐月FVC数据(可查看之前的文章获悉详情),原始的逐月栅格数据来源于高吉喜学者…...
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
Streamlit 是一个开源的 Python 库,专为数据科学家和机器学习开发者设计,旨在快速构建数据应用。通过简单的 Python 脚本,开发者无需掌握前端技术,即可将数据分析和模型结果转化为直观、交互式的 Web 应用。其简洁的 API 设计使得…...
OpenJudge | 置换选择排序
总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串,以及大小固定并且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求利用堆实现置换选择排序&a…...
如何提取b站的视频字幕,下载视频
打开视频地址 按F12打开—开发者工具 在开发者工具打开Network 过滤器关键字: 自动生成字幕:ai_subtitle 自制:json 打开/关闭字幕 刷新页面 找到字幕 点选字幕的respond 将方框中的内容复制; 复制到:https://www.drea…...
Vue中使用ECharts实现热力图的详细教程
在数据可视化领域,热力图是一种非常直观的表现形式,它通过颜色深浅来展示数据分布情况。在Vue项目中,我们可以使用ECharts这一强大的图表库来实现热力图。下面我将详细介绍如何在Vue中使用ECharts实现热力图。效果如下图: 一、准备…...
Arduino UNO R3自学笔记13 之 Arduino使用LM35如何测量温度?
注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:学习使用传感器测温。 1.LM35介绍 一般来讲当知道需求,就可以 通过既定要求的条件来筛选需要的器件,多方面的因素最终选定了器件…...
蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键
蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键 第一节 硬件解读第二节 CubeMX配置第三节 MDK代码 第一节 硬件解读 扩展模块和ADC模块是一摸一样的,插在主板上。 引脚对应关系: PB6-ROW1 PB7-ROW2 PB1-COLUMN1 PB0-COLUMN2 PA8-COLUMN3 …...
Apollo9.0 Planning2.0决策规划算法代码详细解析 (4): PlanningComponent::Proc()
🌟 面向自动驾驶规划算法工程师的专属指南 🌟 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏!本专栏专为自动驾驶规划算法工程师量身打造,旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...
HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...
