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

在这里插入图片描述

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 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)使用 ConfigServer 实例

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

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())

标题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.rhkb.cn/news/438923.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

界星空科技漆包线行业称重系统

万界星空科技为漆包线行业提供的称重系统是其MES制造执行系统解决方案中的一个重要组成部分。以下是对该系统的详细介绍: 一、系统概述 万界星空科技漆包线行业称重系统,是集成在MES系统中的一个功能模块,专门用于漆包线生产过程中的重量检…

数据结构-LRU缓存(C语言实现)

遇到困难,不必慌张,正是成长的时候,耐心一点! 目录 前言一、题目介绍二、实现过程2.1 实现原理2.2 实现思路2.2.1 双向链表2.2.2 散列表 2.3 代码实现2.3.1 结构定义2.3.2 双向链表操作实现2.3.3 实现散列表的操作2.3.4 内存释放代…

【玩转 JS 函数式编程_006】2.2 小试牛刀:用函数式编程(FP)实现事件只触发一次

文章目录 2.2 该问题的函数式解 A functional solution to our problem1. 高阶函数解 A higher-order solution2. 高阶函数解的手动测试 Testing the solution manually3. 高阶函数解的自动测试 Testing the solution automatically4. 更好的解决方案 Producing an even better…

idea创建springboot模块

1.点击file->新建->model server url:如果倒数第二个java选项没有11,就把这里改为阿里云的 name:模块名字 location:文件存放的位置 其他的根据图片自行填写 2. 3.验证 如果没有iml文件(不影响,可以不弄)&#…

LabVIEW提高开发效率技巧----属性节点优化

在LabVIEW开发中,优化代码的效率和性能是非常重要的,尤其是在涉及前面板控件的属性节点时。频繁使用属性节点可能会导致程序执行速度的明显下降,特别是在处理大量数据或高频率操作时。下面详细介绍一些在LabVIEW开发中优化属性节点使用的技巧…

数据结构--线性表(顺序结构)

1.线性表的定义和基本操作 1.1线性表以及基本逻辑 1.1.1线性表 (1)n(>0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。 (2)…

4个顶级的大模型推理引擎

LLM 在文本生成应用中表现出色,例如具有高理解度和流畅度的聊天和代码完成模型。然而,它们的庞大规模也给推理带来了挑战。基本推理速度很慢,因为 LLM 会逐个生成文本标记,需要对每个下一个标记进行重复调用。随着输入序列的增长&…

ElasticSearch 备考 -- 备份和恢复

一、题目 备份集群下的索引 task,存储快照名称为 snapshot_1 二、思考 这个涉及的是集群的备份,主要是通过创建快照,涉及到以下2步骤 Setp1:注册一个备份 snapshot repository Setp2:创建 snapshot 可以通过两种方…

MindSearch 部署到Github Codespace 和 Hugging Face Space

conda init后需要重开终端,不然一键复制会导致后续pip install会安装错环境 还是报错 ImportError: cannot import name AutoRegister from class_registry (/opt/conda/envs/mindsearch/lib/python3.10/site-packages/class_registry/__init__.py)pip install --…

【技术分析】嘉楠科技SoC芯片K230

概述 K230是嘉楠科技Kendryte系列AIoT芯片中的最新一代SoC芯片,该芯片采用全新的多异构单元加速计算架构,集成的玄铁C908具有2个高能效RISCV计算核心,内置新一代KPU(Knowledge Process Unit)智能计算单元,…

Unity初识+面板介绍

Unity版本使用 小版本号高,出现bug可能性更小;一台电脑可以安装多个版本的Unity,但是需要安装在不同路径;安装Unity时不能有中文路径;Unity项目路径也不要有中文。 Scene面板 相当于拍电影的片场,Unity程…

Go基础学习11-测试工具gomock和monkey的使用

文章目录 基础回顾MockMock是什么安装gomockMock使用1. 创建user.go源文件2. 使用mockgen生成对应的Mock文件3. 使用mockgen命令生成后在对应包mock下可以查看生成的mock文件4. 编写测试代码5. 运行代码并查看输出 GomonkeyGomonkey优势安装使用对函数进行monkey对结构体中方法…

Chat登录时出现SSO信息出错的解决方法

目录 1. 问题所示2. 问题所示3. 解决方法 1. 问题所示 此贴主要是总结回顾,对此放置在运维专栏 出现如下问题,很懵,以为是节点挂了还是网址蹦了 一直刷新,登录之后就出现这个问题 2. 问题所示 对于SSO,也就是单点登…

深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)

前言 前几天在看论文,打算复现,论文用到了LSTM,故这一篇文章是小编学LSTM模型的学习笔记;LSTM感觉很复杂,但是结合代码构建神经网络,又感觉还行;本次学习的案例数据来源于GitHub,在…

4.4章节python中循环结构得互相嵌套:常用于属于图形(长方形、三角形、菱形)

一、定义和注意事项 在Python中,循环结构(如for循环和while循环)可以互相嵌套。嵌套循环意味着一个循环内部包含另一个循环。这在处理多维数据或需要执行多次迭代的任务时非常有用。 注意: 1.缩进:在Python中&…

实施威胁暴露管理、降低网络风险暴露的最佳实践

随着传统漏洞管理的发展,TEM 解决了因攻击面扩大和安全工具分散而产生的巨大风险。 主动式 TEM 方法优先考虑风险并与现有安全工具无缝集成,使组织能够在威胁被有效利用之前缓解威胁。 为什么威胁暴露管理 (TEM) 在现代网络安全策略中变得至关重要&…

商家营销工具架构升级总结

今年以来,商家营销工具业务需求井喷,需求数量多且耗时都比较长,技术侧面临很大的压力。因此这篇文章主要讨论营销工具前端要如何应对这样大规模的业务需求。 问题拆解 我们核心面对的问题主要如下: 1. 人力有限 我们除了要支撑存量…

C语言 | Leetcode C语言题解之题451题根据字符出现频率排序

题目: 题解: #define HASH_FIND_CHAR(head, findint, out) HASH_FIND(hh, head, findint, sizeof(char), out) #define HASH_ADD_CHAR(head, intfield, add) HASH_ADD(hh, head, intfield, sizeof(char), add)struct HashTable {char key;int val;UT_ha…

《数据密集型应用系统设计》笔记——第二部分 分布式数据系统(ch5-9)

第5章 数据复制 目的: 地理位置更近,降低延迟故障冗余提高读吞吐量 主节点与从节点(主从复制) 主从复制: 写请求发送给主节点,主节点将新数据写入本地存储;主节点将数据更改作为复制的日志发送…

SAP学习笔记 - Basis01 - 创建Client ,拷贝Client

最近工作当中用到了Client间数据移送的内容,想把自己的虚机给弄两个Client。 最后也没完全弄成,先把过程整理一下,以后有空接着弄。 目录 1,SALE - 新建逻辑系统 2,SCC4 - 分配Client到集团 3,RZ10 - 取…