Python協程入門指北

一、什么是協程?

協程(Coroutine)就像可以暫停執行的函數,能夠在執行過程中主動讓出控制權,等準備好后再繼續執行。

生活小例子

想象你在咖啡店排隊:

  • 普通函數:必須一直排到取餐(阻塞等待)
  • 協程:下單后去旁邊座位等,輪到你再回來取(非阻塞)

二、快速入門

1. 最簡單的協程

import asyncioasync def hello():print("開始")await asyncio.sleep(1)  # 暫停1秒print("結束")asyncio.run(hello())  # 運行協程

2. 并發執行多個協程

async def make_coffee(name, time):print(f"{name}開始制作")await asyncio.sleep(time)print(f"{name}制作完成")async def main():# 同時制作三杯咖啡await asyncio.gather(make_coffee("拿鐵", 2),make_coffee("美式", 1),make_coffee("卡布", 3))asyncio.run(main())

輸出順序:美式 → 拿鐵 → 卡布(總耗時3秒)

三、核心概念

1. 關鍵字解析

關鍵字作用說明示例
async定義協程函數async def func():
await暫停等待異步操作await task()
run()啟動協程的主入口asyncio.run(main())

2. 協程 vs 多線程

協程多線程
內存占用約1KB/任務約8MB/線程
切換速度100納秒級1微秒級
適用場景I/O密集型任務CPU密集型任務

四、實戰應用

1. 網絡請求并發

import aiohttpasync def fetch(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():urls = ["url1", "url2", "url3"]results = await asyncio.gather(*[fetch(url) for url in urls])print(f"獲取到{len(results)}個結果")asyncio.run(main())

2. 生產者-消費者模式

async def producer(queue):for i in range(5):await queue.put(i)print(f"生產產品{i}")await asyncio.sleep(0.5)async def consumer(queue):while True:item = await queue.get()print(f"消費產品{item}")queue.task_done()async def main():queue = asyncio.Queue(3)  # 最大容量3await asyncio.gather(producer(queue),consumer(queue))asyncio.run(main())

五、常見問題

1. 為什么我的協程不執行?

  • 忘記使用await調用協程
  • 沒有通過asyncio.run()啟動
  • 在普通函數中調用協程

2. 如何停止無限循環的協程?

task = asyncio.create_task(infinite_task())
await asyncio.sleep(5)
task.cancel()  # 5秒后取消任務

3. 協程會替代多線程嗎?

  • 適合:網絡請求、文件IO、Web服務等I/O密集型場景
  • 不適合:科學計算、圖像處理等CPU密集型任務

六、優化

  1. 避免阻塞操作:用await asyncio.sleep()代替time.sleep()
  2. 限制并發量
sem = asyncio.Semaphore(10)  # 最多同時10個async def limited_task():async with sem:await heavy_work()
  1. 使用結構化并發(Python 3.11+):
async with asyncio.TaskGroup() as tg:tg.create_task(task1())tg.create_task(task2())

備注

個人水平有限,有問題隨時交流~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903724.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下載安裝和使用

資源獲取鏈接: mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用說明資源-CSDN文庫 詳細作用 數據庫服務器的核心文件: 這是一個壓縮包,解壓后包含 MySQL 數據庫服務器的可執行文件、庫文件、配置文件模板等。 它用于在 Linux 系統上安裝…

C++筆記-繼承(下)(包含派生類的默認成員函數,菱形繼承等)

一.派生類的默認成員函數 1.14個常見默認成員函數 默認成員函數,默認的意思就是指我們不寫,編譯器會自動為我們生成一個,那么在派生類中,這幾個成員函數是如何生成的呢? 1.派生類的構造函數必須調用基類的構造函數初…

C++中指針使用詳解(3)數組、指針和函數參數傳遞的底層 ABI實現

要深入理解 數組、指針和函數參數傳遞 的底層 ABI(Application Binary Interface)實現,需要從以下幾個維度出發進行學習: 一、什么是 ABI? ABI 是編譯器和操作系統之間的協定,規定了: 函數如何…

【RustDesk 】中繼1:壓力測試 Python 版 RustDesk 中繼服務器

測試 Python 版 RustDesk 中繼服務器 測試我們實現的中繼服務器有幾種方法,從簡單到復雜依次如下: 1. 基本連接測試客戶端 創建一個簡單的測試客戶端來驗證中繼服務器的基本功能: 2. 用兩個測試客戶端測試中繼功能 要測試完整的中繼功能,你需要運行兩個客戶端實例來模擬…

Spring Boot集成Spring Cloud 2024(不使用Feign)

本文介紹Spring Boot集成Spring Cloud 2024,且不使用Feign,而是采用Spring 6自帶的HttpExchange方式進行服務調用的詳細步驟: 環境準備 Spring Boot版本:推薦使用Spring Boot 3.4.1及以上版本,以更好地與Spring Clou…

vue中$set原理

Vue 中的 $set 方法(Vue.set)主要用于 向響應式對象中添加一個新的屬性,并確保這個新屬性是響應式的,能夠觸發視圖更新。 📌 背景問題:為什么需要 $set? 在 Vue 2 中,直接給對象新增…

Superset二次開發之深度解讀系列:1.概述

Apache Superset 是一款現代化的企業級商業智能 Web 應用程序,專為數據探索和可視化而設計。本概述介紹了 Superset 的架構、核心組件和主要功能,以幫助開發人員了解該系統的工作原理。 What is Apache Superset? Apache Superset 是一個開源數據探索…

Linux系統之elfedit詳解

elfedit 是一個用于修改 ELF(可執行與可鏈接格式)文件頭的工具。它允許用戶根據指定的條件(如機器類型、文件類型、操作系統/ABI)匹配并更新 ELF 文件的頭部信息。支持 32 位和 64 位 ELF 文件,以及包含 ELF 文件的歸檔…

前端HTML基礎知識

1.HTML介紹 HTML(HyperText Markup Language,超文本標記語言)是構成網頁的基本元素,是一種用于創建網頁的標準化標記語言。HTML不是一種編程語言,而是一種標記語言,通過標簽來描述網頁的結構和內容。 超文本:超文本是…

【IP101】圖像濾波技術詳解:從均值濾波到高斯濾波的完整指南

🌟 圖像濾波魔法指南 🎨 在圖像處理的世界里,濾波就像是給圖片"美顏"的魔法工具。讓我們一起來探索這些神奇的濾波術吧! 📑 目錄 1. 均值濾波:圖像的"磨皮"大法2. 中值濾波&#xff1…

LINE FRIENDS 正式與 Walrus 合作,全新 AI 驅動的游戲即將上線

風靡全球的 LINE FRIENDS 角色即將以“minini”迷你造型登陸 Walrus,雖然尺寸更小,但承諾帶來“大”動作。IPX(LINE FRIENDS 背后的公司)打造了《minini universe: ROOM》游戲,這是一款基于其 minini 系列角色的多鏈游…

2025年信息素養大賽C++算法創意實踐挑戰賽初賽樣題及答案解析(小學組)

一、選擇題 1、下列代碼&#xff0c;能夠輸出 hello world 的是_____ A. cout (hello world) B. cout << hello world C. cout:hello world D. cout << "hello world"; 答案&#xff1a;D 解析&#xff1a;cout輸出的文本內容要用雙引號引起來 2、…

[c語言日寄]檢查環形鏈表

【作者主頁】siy2333 【專欄介紹】?c語言日寄?&#xff1a;這是一個專注于C語言刷題的專欄&#xff0c;精選題目&#xff0c;搭配詳細題解、拓展算法。從基礎語法到復雜算法&#xff0c;題目涉及的知識點全面覆蓋&#xff0c;助力你系統提升。無論你是初學者&#xff0c;還是…

黃雀在后:外賣大戰新變局,淘寶+餓了么開啟電商大零售時代

當所有人以為美團和京東的“口水戰”硝煙漸散&#xff0c;外賣大戰告一段落時&#xff0c;“螳螂捕蟬&#xff0c;黃雀在后”&#xff0c;淘寶閃購聯合餓了么“閃現”外賣戰場&#xff0c;外賣烽火再度燃起。 4 月30日&#xff0c;淘寶天貓旗下即時零售業務“小時達”正式升級…

如何在uni-app中自定義輸入框placeholder的樣式

在開發uni-app應用時&#xff0c;我們經常需要自定義輸入框&#xff08;<input>&#xff09;的樣式以匹配應用的整體設計。默認情況下&#xff0c;uni-app的輸入框提供了一些基本的樣式選項&#xff0c;但有時候我們需要更細致地控制輸入框的每個部分&#xff0c;例如pla…

使用Node編寫輕量級后端快速入門

使用Node編寫輕量級后端快速入門 node 要作為輕量級后端需要下載一些對應模塊可以參考下面命令。你可以借助 npm&#xff08;Node Package Manager&#xff09;來下載它們。 模塊下載 express&#xff1a;這是一個廣受歡迎的 Node.js Web 應用框架&#xff0c;能用于構建 Web…

從Markdown到專業文檔:如何用Python打造高效格式轉換工具

在技術寫作、學術研究和企業報告領域,Markdown因其簡潔高效的特性廣受開發者喜愛。但當需要輸出正式文檔時,Word和PDF格式仍是行業標準。傳統解決方案往往存在樣式丟失、代碼排版混亂、批量處理困難等痛點。本文將揭秘如何用Python構建一個支持多主題、保留代碼高亮、自動生成…

【docker學習筆記】如何刪除鏡像啟動默認命令

一些鏡像會在它打鏡像時&#xff0c;加入一些默認的啟動命令&#xff0c;可以通過docker inspect \<image id\>來查看Entrypoint。如下圖&#xff0c;docker run啟動時&#xff0c;會默認執行 "python3 -m vllm.entrypoints.openai.api_server" 如果不想執行&…

任意無人機手柄鏈接Unity-100元的鳳凰SM600手柄接入Unity Input System?

網上教程真少&#xff01;奮發圖強自力更生&#xff01;2025.5.1 目前有用的鏈接&#xff1a; unity如何添加自定義HID設備&#xff0c;自己開發的手柄如何支持unity。 - 嗶哩嗶哩 HID Support | Input System | 1.0.2 官方教程 https://zhuanlan.zhihu.com/p/503209742 分…

2024睿抗CAIP-編程技能賽-本科組(省賽)題解

藍橋杯拿了個省三&#xff0c;天梯沒進1隊&#xff0c;睿抗是我最后的機會 RC-u4 章魚圖的判斷 題目描述 對于無向圖 G ( V , E ) G(V,E) G(V,E)&#xff0c;我們定義章魚圖為&#xff1a; 有且僅有一個簡單環&#xff08;即沒有重復頂點的環&#xff09;&#xff0c;且所…