asyncio 与 uvloop

事件循环

事件循环 = 协调所有协程执行的中央调度器,它通过非阻塞机制,实现并发执行多个异步任务。

事件循环是 异步编程的核心机制,用一句话概括就是:

事件循环不断检查任务队列,一旦某个异步任务完成,它就调用该任务的回调并继续循环执行。

它的目标是:非阻塞地执行多个任务(如 I/O、网络请求),避免因为等待某个任务而卡住整个程序。

概念说明
协程(coroutine)你写的 async def 函数
任务(Task)协程包装成可调度对象,由事件循环驱动执行
Future代表“未来某个时间点”的值;Task 是它的子类
async def xxx():↓
coroutine obj↓
Task.create↓
注册到 event loop↓
loop.run_until_complete()↓
调度、挂起、恢复...

事件循环最大的优势在于:可以在等待 I/O(如网络、磁盘)时释放 CPU 去执行其他任务

  • 并发网络请求(aiohttp)
  • 异步数据库访问(如 asyncpg)
  • Web 框架(FastAPI、Sanic)
  • 实时任务调度系统(如定时器、爬虫)

asyncio

asyncio 是 Python 3.4 引入的标准库,用于编写协程式的异步代码。它的核心包括:

  • 事件循环(Event Loop)
  • 协程(Coroutine)
  • Task / Future 管理
  • 异步 I/O 支持(网络、文件、子进程等)
  • 高级工具(如 asyncio.gather()、Queue、锁等)

本质:asyncio 提供了一个异步框架,用于非阻塞的 I/O 编程。

uvloop

uvloop 是一个用 Cython 编写的 高性能事件循环实现,替代默认的 asyncio 事件循环。它基于 libuv(Node.js 的底层库),因此性能极佳。

特点:

  • 全兼容 asyncio 接口
  • 性能提升 2~4 倍(实际测试中)
  • 安装简单,几乎无缝切换

比较

uvloop 比默认 asyncio 更快,本质原因在于事件循环的底层实现完全不同:uvloop 用 C/Cython 构建并基于 libuv,而默认 asyncio 用纯 Python 和 selectors 实现,性能存在数量级差异。

特性asyncio(默认事件循环)uvloop(替代实现)
性能中规中矩高性能、近 C 语言速度
实现语言纯 Python + CCython + libuv
使用方式内置、开箱即用pip 安装 + 手动设置
兼容性官方标准完全兼容 asyncio
实现吞吐量(req/s)延迟(ms)
asyncio5,000 req/s20ms
uvloop15,000 req/s7ms
使用场景推荐使用
CPU 密集型任务❌ 不适合 asyncio(建议多线程或多进程)
I/O 密集型任务(网络、文件等)✅ 推荐 asyncio + uvloop
高并发服务(Web、代理、网关等)✅ 强烈推荐 uvloop 提升吞吐和稳定性

uvloop 是不支持 Windows 的!它是专为 Unix/Linux/macOS 优化的高性能事件循环。

  • uvloop 是基于 libuv 实现的,而 libuv 的 Windows 支持不适合用作 Python 的事件循环替代
  • Windows 的 asyncio 默认使用的是 ProactorEventLoop(基于 IOCP),和 libuv 的模型完全不同。

使用 uvloop 来实现 高并发 部署:

CMD ["uvicorn", "web.main:app", "--host", "0.0.0.0", "--port", "8077", "--loop", "uvloop", "--http", "h11"]
维度asyncio**(默认事件循环)**uvloop
实现语言Python + 少量 CCython + libuv(C语言)
底层机制使用 selectors(如 epoll/kqueue)做调度,Python 层调度任务和回调直接使用高性能 libuv,类似 Node.js 的底层模型
调度逻辑Python 层事件循环和回调调度开销较大C 层事件循环和回调分发更快,几乎无 Python 层切换开销
系统调用封装Python 层对 socket/select 封装C 层封装系统调用,效率极高
GC 压力更多 Python 对象交互减少 Python 调度逻辑,内存压力更小
  • 在 asyncio 中,事件循环会:
    1. 通过 selectors 监听 socket 是否可读
    2. 如果 socket 可读,则通过 Python 层的回调触发处理
    3. 执行用户协程,继续 await…

这个过程中:

👉 Python 层频繁调用回调函数、切换上下文、管理 Future 状态,调度开销较大


但 uvloop 做了什么?

  • 使用 C 写的 libuv 做事件循环(本来就是 Node.js 的核心)
  • 所有事件监听、回调调度、超时处理等都在 C 层完成
  • Python 只负责“最终执行协程”,调度工作都交给高性能 C 层完成

所以:

uvloop 省去了 Python 层大量的中间操作,减少了解释器层面的性能瓶颈。

uvloop 主要提升在:

  • I/O 调度速度
  • 协程切换效率
  • 回调调用效率

但对于 CPU 密集型任务(如复杂数据处理、机器学习),uvloop 并不会提升太多,应考虑多进程或线程池。

uvloop 比 asyncio 快的本质在于:它把事件循环和 I/O 调度从 Python 层搬到了高效的 C 层(libuv),最大限度减少了解释器负担。

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

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

相关文章

一文读懂循环神经网络(RNN)—语言模型+n元语法(1)

目录 什么是语言模型? 语言模型的核心目的 一.量化文本的合理性 二.支持下游 NLP 任务 三. 语义和上下文依赖 一元语法、二元语法和三元语法详解 核心概念:n-gram 模型 1. 一元语法(Unigram) 2. 二元语法(Bigram…

DirectX12(D3D12)基础教程九 间接绘制

在学习directx12 microsoft提供了很多示例,有简单的也有复杂,下载网址:https://github.com/microsoft/DirectX-Graphics-Samples 本章对D3D12ExecuteIndirect 示例做了简化,只保留间接绘制部分,删除了计算着色器部分。 间接绘制…

fastApi连接数据库

1:pip install tortoise-orm2:pip install aiomysql3:pip install asyncmy或者使用国内清华园pip install -i https://pypi.tuna.tsinghua.edu.cn/simple asyncmy4:pip install aerich通过 python -m 直接运行(推荐&a…

Apache-web服务器环境搭建

目录 实验要求 思路总结 1.常规配置web服务 2.通过用户主页配置web服务 3.通过虚拟目录配置web服务 4.添加DNS解析服务,访问虚拟机域名: www.TestWeb.com 实验要求 (ip 192.168.48.130) 1、常规配置web服务 2、通过用户主页配置web服务 3、通过虚…

Altium Designer 25 安装与配置完整教程

本教程将带您一步步完成 Altium Designer 25 的下载、安装与激活配置 第一步:下载安装包 首先,需要获取 Altium Designer 25 的完整安装程序。 👉 下载链接: 百度网盘:百度网盘 请输入提取码 提取码: dxei 夸克网盘…

【工具】AndroidStudio修改中文语言汉化

AndroidStudio修改中文语言汉化 https://github.com/sollyu/AndroidStudioChineseLanguagePackhttps://github.com/sollyu/AndroidStudioChineseLanguagePack

代码随想录|图论|15并查集理论基础

并查集理论基础 | 代码随想录 并查集还是比较简单的,只要搞清楚两个事情: 并查集是干啥的?解决什么类型问题?并查集模板(背下来) 1、并查集是干啥的 并查集主要是两个功能: 两个元素添加到…

用MYSQL学习sql第一次总结和作业

总结 数据库(Database) 理解为“文件夹”,里面可以装很多张表。作业中要求先建一个名字叫 mydb6_product 的数据库。 表(Table) 理解为“Excel 工作表”,由“列(字段)”和“行&…

SQLite技术架构解析,适用场景有哪些?

一、SQLite技术架构解析 SQLite是一款轻量级、无服务器、嵌入式关系型数据库,其架构设计围绕“简化复杂性、提升效率”展开,核心由前端(SQL处理)、执行引擎(VDBE)、存储引擎(B-Tree)…

【Luogu】每日一题——Day3. P6392 中意 (数学 取模)

链接:P6392 中意 - 洛谷 题目: 思路: 数论这一块 题目让我们求这个结果对 MOD 取模,那么我们肯定是不像看到这个除法,所以考虑如何消除这个除法 我们可以想到,向上取整就是加上一个数,假设其为…

React强大且灵活hooks库——ahooks入门实践之DOM类hook(dom)详解

什么是 ahooks? ahooks 是一个 React Hooks 库,提供了大量实用的自定义 hooks,帮助开发者更高效地构建 React 应用。其中 DOM 类 hooks 是 ahooks 的一个重要分类,专门用于处理 DOM 相关操作,如事件监听、元素状态、拖…

GeoTools 工厂设计模式

前言使用GeoTools开发时有必要了解其工厂设计模式,作为软件开发核心设计模式,其设计思想具有普遍性和研究性。明白方法原理有助于提高开发效率,达到事半功倍的效果。1. 工厂模式 工厂模式(Factory Pattern)是面向对象中…

npu-smi info命令参数解释

华为昇腾npu-smi显示npu-smi工具的帮助信息npu-smi -h字段说明-h命令的帮助信息–help命令的帮助信息-vnpu-smi版本信息info显示硬件详细信息set修改设备配置属性clear清除设备信息upgrade升级MCU固件 npu-smi info 用于监控和管理华为NPU的状态和性能字段值说明npu-smi24.1.rc…

OneCode3.0 通信架构简介——MCPServer微内核设计哲学与实现

在数字化转型加速的今天,低代码平台已成为企业快速交付应用的核心基础设施。然而,通用消息中间件与低代码开发范式之间存在难以调和的矛盾:标准化协议无法匹配可视化编排的动态性,通用架构难以满足低代码场景下高频短消息的性能需…

Android14 Launcher3 修改All App上下滑动头部显示阴影

正常情况下的样子: 下拉App抽屉后的样子:修改方案:qssi14/packages/apps/Launcher3/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.javaprotected void updateHeaderScroll(int scrolledOffset) {float prog1 Utilities…

Zookeeper入门安装与使用详解

文章目录一、简介二、下载安装1、安装jdk2、windows(1)下载(2)配置与启动一、简介 略。 二、下载安装 1、安装jdk 安装jdk8,高版本可能会有问题。 2、windows (1)下载 官网地址&#xff…

设计模式之适配器模式:让不兼容的接口协同工作的艺术

适配器模式:让不兼容的接口协同工作的艺术在软件开发中,我们经常会遇到系统整合的挑战——如何让新旧组件协同工作?适配器模式正是解决这类接口不兼容问题的利器,本文将深入探讨这一经典设计模式。1. 引言:接口不兼容的…

AI驱动的软件工程(中):文档驱动的编码与执行

📚 系列文章导航 AI驱动的软件工程(上):人机协同的设计与建模 AI驱动的软件工程(中):文档驱动的编码与执行 AI驱动的软件工程(下):AI辅助的质检与交付 大家好…

HTML应用指南:利用GET请求获取河南省胖东来超市门店位置信息

胖东来作为中国知名的零售企业,自1995年成立以来,始终致力于为消费者提供丰富、新鲜的商品选择与优质的购物体验。经过近30年的稳步发展,目前已在河南省内的许昌、新乡等地共开设13家门店,涵盖大型综合百货商场、中型社区超市及服…

8.服务通信:Feign深度优化 - 解密声明式调用与现代负载均衡内核

让服务调用更优雅 在微服务架构中,服务间通信如同血液流动般重要。传统方式中,开发者需要手动拼接URL、处理负载均衡、管理连接池——这些重复性工作不仅效率低下,还容易出错。Spring Cloud OpenFeign 的诞生,正是为了解决这一核心痛点。它通过声明式接口将HTTP请求模板化…