当前位置: 首页 > article >正文

python uvicorn

### 从Python开发角度聊聊Uvicorn一个异步服务器的自我修养1. 他是什么先别急着把Uvicorn当作一个普通的Web服务器它更像是给Python异步生态设计的一个高速引擎。这么说吧如果你把Django或Flask这样的框架看作一辆家用轿车那Uvicorn就是那个能把这辆车改造成赛车的改装师。它本质上是一个ASGI服务器而不是传统的WSGI服务器。ASGI异步服务器网关接口这个规范说白了就是让Python程序能像Node.js那样处理高并发IO操作。Uvicorn的名字其实挺直白的——它来自UV代表超高速度的uvloop事件循环和corn可能来自unicorn。它最初是作为Starlette框架的子项目诞生的但很快就独立出来因为大家发现它不仅仅是配套工具更是整个Python异步生态的连接器。它依赖uvloop这个用Cython重写的事件循环库所以能在某些场景下比纯Python的asyncio快2-4倍。一个有意思的细节是Uvicorn内部运行时会自动检测你的系统是否支持HTTP/2协议甚至能原生处理WebSocket连接这些都是传统WSGI服务器做不到的。2. 他能做什么最直观的用途当然是跑异步Web框架。比如你用FastAPI写了个API服务直接用python main.py这种老办法跑是不行的因为FastAPI是异步框架需要ASGI服务器来驱动它。Uvicorn就是那个让FastAPI真正跑起来的东西。而且它不仅支持FastAPI只要是符合ASGI规范的框架比如Starlette、Quart甚至通过适配器层的Django Channels它都能跑。但它的能耐不止于此。很多人不知道的是Uvicorn还可以当作异步脚本的执行器。比如你写了个需要做并发网络请求的爬虫脚本可以用uvicorn my_script:app的方式把它包装成一个能接受HTTP请求的服务然后通过服务调用的方式去触发它这样比直接用crontab运行定时任务要灵活得多。更实用的是它的热重载能力。开发的时候加上--reload参数代码一改服务就自动重启配合上代码编辑器的自动保存体验非常接近前端开发中的webpack-dev-server那种即时反馈感。而且Uvicorn的热重载不会丢失连接状态——这一点比用Gunicorn配合Django的时候要舒服不少。还有个小众但好用的功能你可以用Uvicorn搭建一个本地文件服务器。只需要写个简短的ASGI应用就能快速分享文件比开个Nginx方便多了。3. 怎么使用安装特别简单常规操作就是pip install uvicorn。如果你要跑FastAPI应用通常要加上[standard]扩展包它会帮你把uvloop、httptools这些性能组件都装上。跑起来最简单的方式是这样# main.pyfromfastapiimportFastAPI appFastAPI()app.get(/)defread_root():return{Hello:World}然后在终端里执行uvicorn main:app --reload --port 8000。这里main:app的意思是导入main.py文件里的app变量。你可能会觉得奇怪为什么不是直接运行文件这是因为Uvicorn的设计哲学特别强调模块导入——这种机制能让它在热重载时正确追踪代码变更。如果想让服务跑得更稳通常会配上进程管理。很多人喜欢用Gunicorn来管理Uvicorn的工作进程比如gunicorn-w4-kuvicorn.workers.UvicornWorker main:app这里的关键是-k参数指定了worker类为UvicornWorker这样Gunicorn会启动4个Uvicorn进程来分摊负载。但说实话对于大多数中小规模的业务直接用Uvicorn的多worker模式就够了uvicorn main:app --workers 4。配置定制化方面Uvicorn支持通过环境变量或配置文件来调整。比如你想限制请求体大小可以设置UVICORN_LIMIT_CONCURRENCY环境变量。更优雅的方式是写个YAML配置文件# uvicorn.yamlhost:0.0.0.0port:8000workers:2limit_concurrency:100timeout_keep_alive:30然后uvicorn main:app --config uvicorn.yaml就能加载这些配置。4. 最佳实践头一条永远别在生产环境用--reload。这个参数虽然开发方便但会禁用掉很多性能优化而且在生产环境中频繁重启服务会导致连接颠簸。一定要用进程管理工具比如supervisor、systemd或者容器编排系统来管理Uvicorn的生命周期。关于worker数量有个简单的经验法则对于CPU密集型任务worker数等于CPU核心数对于IO密集型任务可以设为核心数的2-4倍。但要注意别设太多因为Python的GIL会让多worker之间的竞争特别激烈。另一个细节是当设置多个workers时每个worker都会创建一个独立的事件循环这意味着你写的全局变量要格外小心——各个worker之间是完全隔离的。日志配置经常被忽略。Uvicorn默认的日志格式是线性的在日志量大的时候很难区分不同请求的时间线。建议自定义日志格式importuvicorn LOG_FORMAT%(asctime)s - %(levelname)s - [%(name)s] - %(message)suvicorn.run(main:app,log_config{version:1,formatters:{default:{format:LOG_FORMAT,},},})另一个容易被忽略的是Uvicorn的优雅关闭机制。当收到SIGTERM信号时Uvicorn会等待所有请求处理完成后再关闭。但如果你写的异步函数里有长时间运行的协程它可能不会主动中断它们。正确做法是在应用层用asyncio.shield保护关键操作或者设置合理的超时时间。部署到生产环境时Uvicorn前面通常会放一个反向代理。很多人喜欢用Nginx但其实Caddy或Traefik对HTTPS证书的管理更省心。Uvicorn本身不处理SSL终止因为它的底层性能优化跟加密通道设计上有冲突所以反向代理是必须的。最后说下性能调优。Uvicorn默认的最大并发连接数是1000如果预估流量超过这个数记得调大--limit-concurrency。另外可以通过--backlog 2048来增大连接队列大小应对突发流量。对于文件上传的场景记得调整--limit-max-requests避免长时间占用worker导致其他请求排队。5. 和同类技术对比先看Gunicorn。Gunicorn是经典的WSGI服务器用pre-fork模型处理请求。如果拿Uvicorn和Gunicorn跑同步框架比如FlaskGunicorn还是有不少优势——它的worker管理更成熟信号处理更完善。但一旦遇到异步框架或者高并发的WebSocket连接Gunicorn就显得力不从心了因为它不支持ASGI。你可以用Gunicorn配合UvicornWorker来跑异步应用但本质上还是多了一层封装效率上比原生Uvicorn略差。再看Daphne。这是Django Channels官方推荐的ASGI服务器但它的开发速度明显慢于Uvicorn而且Daphne的HTTP协议解析用的是纯Python实现性能比Uvicorn差一大截。如果你用Django ChannelsDaphne是必选项但如果用的是FastAPI或Starlette完全没必要碰Daphne。Hypercorn也是一个ASGI服务器它支持HTTP/3和TRIO事件循环这是Uvicorn目前没有的。但Hypercorn的性能测试普遍不如Uvicorn尤其在高并发下差距明显。如果你特别需要HTTP/3支持比如用于实时视频流Hypercorn值得尝试但日常REST API开发还是Uvicorn更靠谱。还有些人在用AIOHTTP直接启动应用这其实就是自己手撸ASGI服务器虽然灵活但很容易在连接管理、超时处理这些细节上出问题。Uvicorn在这些边界情况上已经踩过很多坑直接用现成的工具更省心。最后说下Node.js的服务器比如ExpressKoa和Uvicorn的对比。这俩其实各自有天然优势Node.js的单线程事件循环在处理大量短连接时非常高效而Uvicorn的多进程异步模式在处理长连接和流式数据时有更好的表现。两者在WebSocket支持上都很成熟但Python的生态在数据处理和机器学习的领域要比Node.js强太多。如果要给个结论如果你的应用是同步的、长时间运行的比如后台任务Gunicorn更适合如果是异步的、需要处理大量短连接的Uvicorn是更优解对于像Django这样的老框架如果能迁移到新版支持的ASGI模式Uvicorn也能带来显著的性能提升。选型没有银弹关键看你的业务场景对实时性、并发量和部署复杂度的要求。

相关文章:

python uvicorn

### 从Python开发角度聊聊Uvicorn:一个异步服务器的自我修养 1. 他是什么 先别急着把Uvicorn当作一个普通的Web服务器,它更像是给Python异步生态设计的一个高速引擎。这么说吧,如果你把Django或Flask这样的框架看作一辆家用轿车,那…...

python gunicorn

### 从日常运维到生产部署:Python世界里那个叫Gunicorn的“管家” 先聊聊Gunicorn是什么。简单说,它是一个WSGI HTTP服务器,专门用来跑Python写的Web应用。WSGI这东西说白了就是Python Web世界里一个约定好的规矩——一个接口标准&#xff0c…...

魔兽争霸3终极优化方案:告别卡顿,体验丝滑流畅的游戏体验

魔兽争霸3终极优化方案:告别卡顿,体验丝滑流畅的游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3的卡…...

python tornado

# 聊聊Tornado:一个被低估的Python异步框架 它到底是什么 Tornado,本质上是一个用Python写的非阻塞式Web服务器框架。说到这个问题,得从开发者面临的一个实际困境说起。 去年我帮一个朋友重构他的爬虫服务,用的是Flask跑在Gunicor…...

GetQzonehistory:3分钟学会一键备份QQ空间所有历史说说

GetQzonehistory:3分钟学会一键备份QQ空间所有历史说说 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里的珍贵回忆会随着时间流逝而消失?那些…...

STM32的DMA搬运工进阶指南:FIFO、Burst、双缓冲到底怎么选?附F429实测数据

STM32的DMA搬运工进阶指南:FIFO、Burst、双缓冲到底怎么选?附F429实测数据 在嵌入式开发中,数据搬运效率往往成为系统性能的瓶颈。想象一下这样的场景:你的STM32正在处理高频率ADC采样数据,同时还要将图形界面刷新到LC…...

Amlogic S9xxx设备Armbian系统深度改造实战突破

Amlogic S9xxx设备Armbian系统深度改造实战突破 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk3568, rk3399, r…...

跟着 MDN 学 HTML day_8:(高级文本语义标签+适配核心功底)

各位前端入门的小伙伴大家好,咱们跟着MDN系统学HTML的系列专栏持续更新中!前面6天我们已经搞定了基础排版标签、基础列表、超链接、图片嵌入、基础表单、简易布局配套HTML核心用法,今天高级HTML文本语义特性。 很多新手写页面只会用div、p、s…...

获利能力分析会计-Part 1

组织结构 定义经营范围(KEP8) 以上配置定义了Operating Concern。 定义特征字段(KEA5) 注意:此处定义的特征字段其实只是COPA的一部分特征字段,SAP预定义了一些特征字段,不需要 在此处维护。 以下界面展示了目前该Client所有的“特征”字段…...

ESP固件烧录终极指南:5分钟快速掌握esptool完整用法

ESP固件烧录终极指南:5分钟快速掌握esptool完整用法 【免费下载链接】esptool Serial utility for flashing, provisioning, and interacting with Espressif SoCs 项目地址: https://gitcode.com/gh_mirrors/es/esptool 你是否正在寻找一款简单高效的ESP芯片…...

小榄的AI优化提供商靠谱吗?

引言在数字化转型的浪潮中,AI优化成为了企业提升竞争力的重要手段。小榄地区作为广东省的重要制造业基地,涌现出了一批AI优化提供商。然而,企业在选择这些提供商时,往往会面临“是否靠谱”的疑问。本文将以「创意岛」为例&#xf…...

图像识别风电机组叶片故障诊断【附代码】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅ 如需沟通交流,扫描文章底部二维码。(1)幂律变换与自适应高斯滤波融合的图像预处理策略:…...

突破传统金融数据获取瓶颈:AKShare与Pandas融合的量化分析新范式

突破传统金融数据获取瓶颈:AKShare与Pandas融合的量化分析新范式 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirr…...

如何用5分钟搭建你的智能象棋助手:Vin象棋完整教程

如何用5分钟搭建你的智能象棋助手:Vin象棋完整教程 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 想在电脑上享受AI辅助下棋的乐趣吗&#xf…...

从租户到用户:ThingsPanel多角色权限实战指南(附设备接入与看板配置)

从租户到用户:ThingsPanel多角色权限实战指南(附设备接入与看板配置) 在物联网平台的实际运营中,权限管理往往是决定项目成败的关键因素。ThingsPanel作为一款开源的物联网平台,其多租户架构设计为团队协作提供了天然优…...

开源LLM工程平台Langfuse:实现AI应用开发、监控与调试一体化

1. 项目概述:Langfuse,一个开源的LLM工程平台如果你正在构建基于大语言模型(LLM)的应用,无论是简单的聊天机器人、复杂的智能体系统,还是企业级的RAG(检索增强生成)解决方案&#xf…...

SNOW-V算法C语言实现

新手第一次写算法&#xff0c;有冗余部分多多包涵。SNOW_V.c部分#include <stdio.h> #include "SNOW_V.h" #include <string.h> #include <stdint.h>struct Infor {uint16_t Key[16]; //算法运算的密钥uint16_t IV[8]; //算法运算的初始化向…...

抖音批量下载终极方案:三步搞定无水印视频与音乐

抖音批量下载终极方案&#xff1a;三步搞定无水印视频与音乐 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...

【读书笔记】《你就是孩子最好的玩具》

《你就是孩子最好的玩具》核心要点整理一、为什么读这本书 本书是在养孩子之前读到的最重要的育儿书籍之一。核心观点是&#xff1a;父母才是孩子最好的玩具&#xff0c;父母的教育方式直接决定孩子的人格底色。孩子是父母的复印件。复印件出了问题&#xff0c;根源在原件。二、…...

中山AI优化提供商哪家强?原来有这些选择!

在数字化转型的浪潮中&#xff0c;AI优化已成为企业提升品牌曝光和市场竞争力的重要手段。中山作为粤港澳大湾区的重要城市&#xff0c;拥有众多AI优化提供商。那么&#xff0c;哪家提供商最为强大呢&#xff1f;本文将为您详细解析。引言随着AI技术的迅猛发展&#xff0c;企业…...

别再只盯着主站了!手把手教你用树莓派+EtherCAT HAT搭建一个低成本从站(附避坑指南)

树莓派EtherCAT HAT&#xff1a;低成本工业自动化从站开发实战指南 工业自动化领域长期被高价专用设备垄断&#xff0c;直到开源硬件与标准化协议打破了这一局面。想象一下&#xff0c;用不到千元的预算就能搭建一个功能完备的EtherCAT从站——这正是树莓派搭配专用HAT模块带来…...

终极暗黑3按键助手:5分钟快速上手指南,告别手动重复操作

终极暗黑3按键助手&#xff1a;5分钟快速上手指南&#xff0c;告别手动重复操作 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专…...

告别乱码!树莓派5与Windows电脑串口调试最全指南(含CH340驱动)

树莓派5与Windows跨平台串口通信实战指南 第一次尝试用树莓派5通过串口与Windows电脑通信时&#xff0c;我遇到了驱动无法识别、波特率不匹配、中文显示乱码等一系列问题。经过72小时的反复调试和查阅资料&#xff0c;终于整理出这套完整的解决方案。本文将手把手带你避开所有坑…...

ROS2 C++开发系列04:如何有效输出机器人状态

&#x1f4fa; 配套视频&#xff1a;ROS2 C开发系列04&#xff1a;如何有效输出机器人状态 ROS2 C 基础&#xff1a;使用 I/O 流输出机器人状态 在机器人软件开发中&#xff0c;实时监控机器人的运行状态至关重要。C 标准库中的 <iostream> 提供了强大的输入输出功能&am…...

MAA明日方舟自动化助手完整指南:如何一键解放双手高效长草

MAA明日方舟自动化助手完整指南&#xff1a;如何一键解放双手高效长草 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https:/…...

从零到上板:用FPGA实现SPI主从机完整数据回环(Vivado ILA抓波形实战)

从零到上板&#xff1a;用FPGA实现SPI主从机完整数据回环&#xff08;Vivado ILA抓波形实战&#xff09; 在嵌入式系统开发中&#xff0c;SPI协议因其高速、全双工的特性成为芯片间通信的首选方案之一。本文将带您完成一个完整的FPGA开发流程&#xff1a;从Verilog代码编写、功…...

别只用来显示文字!蓝桥杯嵌入式LCD高亮、闪烁特效的三种实现方法

蓝桥杯嵌入式LCD视觉特效开发实战&#xff1a;从基础到高阶的三维进阶方案 在蓝桥杯嵌入式竞赛中&#xff0c;LCD屏幕作为人机交互的核心界面&#xff0c;其视觉效果直接影响评委对作品完成度的评价。许多参赛者仅满足于基础文字显示功能&#xff0c;却忽略了LCD驱动芯片&#…...

OpenClown:为AI助手配备多维度专家评审团,提升输出质量与安全性

1. 项目概述&#xff1a;当AI助手完成任务后&#xff0c;谁来为它“验货”&#xff1f;在AI助手&#xff08;比如OpenClaw&#xff09;日益成为我们日常工作和学习中的得力伙伴时&#xff0c;一个核心问题也随之浮现&#xff1a;我们如何判断AI给出的答案、生成的代码或提出的方…...

第二章、application.properties文件的配置

前面讲到了如何搭建一个简单的springboot应用&#xff0c;是不是特别简单。springboot内置了tomcat&#xff0c;这就大大减少了我们自己配置tomcat所产生的各种各样的配置手续包括所出现的问题。通过main方法&#xff0c;所有启动程序都在SpringApplication.run()这个方法里&am…...

Linux系统PPP拨号全攻略:从串口调试到断线自动重连的完整实现

Linux系统PPP拨号深度实践&#xff1a;从基础配置到工业级稳定连接 在工业自动化、远程监控和物联网设备开发中&#xff0c;稳定可靠的网络连接往往是系统设计的核心挑战。当嵌入式设备部署在野外基站、移动车辆或偏远地区时&#xff0c;通过串行端口建立PPP拨号连接仍然是许多…...