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
英文地址,請注明出處:http://en.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請求模板化…