python異步協程async調用過程圖解

1.背景:

項目中有用到協程,但是對于協程,線程,進程的區別還不是特別了解,所以用圖示的方式畫了出來,用于理清三者的概念。

2.概念理解:

2.1協程,線程,進程包含關系
  • 一個系統可以有多個進程
  • 一個進程可以有多個線程(多個線程為了提高進程的資源利用率)
  • 一個線程可以有多個協程(多個協程為了提高線程的資源利用率)

2.2 共享資源范圍 ,隔離性, 通信方式,適用場景對比

PS:該表從Kimi拷貝

名稱共享資源范圍?隔離性通信方式適用場景
進程獨立內存空間、文件描述符、系統資源管道、消息隊列、共享內存、套接字適用于需要高隔離性和獨立資源的場景,如多用戶環境或需要保護數據安全的場景。
線程進程內存空間、文件描述符、系統資源共享內存、互斥鎖、條件變量適用于需要共享內存和高效通信的場景,如多任務處理或計算密集型任務。
協程線程內存空間、文件描述符、系統資源?非常低異步機制(awaitasyncio.Queue適用于 I/O 密集型任務,如網絡請求、文件讀寫等,可以高效地利用單線程資源,避免線程切換的開銷。

3,協程執行過程示意圖

3.1 執行代碼
#異步調用
import asyncioasync def model_gen(task,time):# 模擬異步過程print('進入' + task)await asyncio.sleep(time)  # 假設模型生成需要5秒print('處理繼續'+ task)await asyncio.sleep(time)  # 假設模型生成需要5秒print('完成' + task)return task+'完成'async def main(name):# 異步調用print(name)#同步函數:asyncio.create_task() 是一個同步函數,它會立即返回一個 Task 對象。#返回的Task對象會被事件循環調度執行,asyncio.create_task() 本身不會等待任務完成。#asyncio.create_task() 提供了一種簡單的方式來將協程包裝成任務并提交到事件循環中,而不會阻塞調用它的線程。task1 = asyncio.create_task(model_gen('task1',4))print('create task1')task2 = asyncio.create_task(model_gen('task2',2))print('create task2')# 等待兩個任務完成,并獲取結果# await 是一個異步操作,當在協程中遇到 await 表達式時,當前協程會暫停執行,并將控制權交還給事件循環。result2 = await task2  # 協程掛載,task2執行完畢之后,才繼續執行后續作業print('hello')result1 = await task1  # task1執行完畢之后,才能繼續執行后續代碼# 打印結果print("所有任務完成!")print(result1)print(result2)#asyncio.run是同步函數,會阻塞當前線程,所以main('main1')全部執行完畢之后,才能執行main2的代碼
asyncio.run(main('main1'))
asyncio.run(main('main2'))
3.2 執行結果

main1
create task1
create task2
進入task1
進入task2
處理繼續task2
處理繼續task1
完成task2
hello
完成task1
所有任務完成!
task1完成
task2完成
main2
create task1
create task2
進入task1
進入task2
處理繼續task2
處理繼續task1
完成task2
hello
完成task1
所有任務完成!
task1完成
task2完成

3.3 執行圖解及理解

圖解如下:左邊三列是協程,第四列是線程的占用情況,最右邊是執行結果輸出。

個人理解:(如果有問題,歡迎指正,目前循環事件如何確定執行哪個協程的這一塊還沒有研究)

1)每個協程啟動之后,一直執行,直到掛起(比如await),可以是掛起多長時間,也可以是等待某個操作完成。掛起結束之后,協程變為可調用的狀態,供事件循環調用
2)事件循環從可調用的協程中,將其放到協程進行執行,直到該協程掛起,再取下一個可調用協程執行。
3)每次協程被調用之后,會一直執行直到下一次掛起(比如await),所以如果協程中有一個非常耗時的同步操作,就有可能導致包含該操作的協程一直占用線程,導致其他協程一直等待。所以寫異步程序時候,需要確認是否有非常耗時的同步操作。

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

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

相關文章

【React】獲取元素距離頁面頂部的距離

文章目錄 代碼實現 代碼實現 import { useEffect, useRef, useState } from react;const DynamicPositionTracker () > {const [distance, setDistance] useState(0);const divRef useRef(null);useEffect(() > {const targetDiv divRef.current;if (!targetDiv) re…

26.OpenCV形態學操作

OpenCV形態學操作 形態學操作(Morphological Operations)源自二值圖像處理,主要用于分析和處理圖像中的結構元素,對圖像進行去噪、提取邊緣、分割等預處理步驟。OpenCV庫中提供了豐富的形態學函數,常見的包括&#xf…

邏輯回歸:損失和正則化技術的深入研究

邏輯回歸:損失和正則化技術的深入研究 引言 邏輯回歸是一種廣泛應用于分類問題的統計模型,尤其在機器學習領域中占據著重要的地位。盡管其名稱中包含"回歸",但邏輯回歸本質上是一種分類算法。它的核心思想是在線性回歸的基礎上添…

大模型面經 | 介紹一下CLIP和BLIP

大家好,我是皮先生!! 今天給大家分享一些關于大模型面試常見的面試題,希望對大家的面試有所幫助。 往期回顧: 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題一) 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題二) 大模型面經 | 春招、秋招算法…

【MCP】第二篇:IDE革命——用MCP構建下一代智能工具鏈

【MCP】第二篇:IDE革命——用MCP構建下一代智能工具鏈 一、引言二、IDE集成MCP2.1 VSCode2.1.1 安裝VSCode2.1.2 安裝Cline2.1.3 配置Cline2.1.4 環境準備2.1.5 安裝MCP服務器2.1.5.1 自動安裝2.1.5.2 手動安裝 2.2 Trae CN2.2.1 安裝Trae CN2.2.2 Cline使用2.2.3 內…

【新能源科學與技術】MATALB/Simulink小白教程(一)實驗文檔【新能源電力轉換與控制仿真】

DP讀書:新能源科學與工程——專業課「新能源發電系統」 2025a 版本 MATLAB下面進入正題 仿真一:Buck 電路一、仿真目的二、仿真內容(一)Buck電路基本構成及工作原理(二)Buck電路仿真模型及元件連接&#xf…

BootStrap:首頁排版(其一)

今天我要介紹的是在BootStrap中有關于首頁排版的內容知識點,即(模態框,選項卡)。 模態框: 模態框經過了優化,更加靈活,以彈出對話框的形式出現,具有最小和最實用的功能集。 在運行…

Spring Data

目錄 一、Spring Data 簡介與生態概覽 什么是 Spring Data? Spring Data 與 Spring Data JPA 的關系 Spring Data 家族:JPA、MongoDB、Redis、Elasticsearch、JDBC、R2DBC…… 與 MyBatis 的本質差異(ORM vs SQL 顯式控制) 二…

建筑末端配電回路用電安全解決方案

一、電氣火災的嚴峻現狀 根據國家應急管理部消防救援局的數據,電氣火災長期占據各類火災原因之首,2021年占比高達50.4%。其中,末端配電回路因保護不足、監測手段落后,成為火災高發隱患點。私拉電線、線路老化、接觸不良、過載等問…

華為開發崗暑期實習筆試(2025年4月16日)

刷題小記: 第一題懷疑測試樣例不完整,貪心法不應該能夠解決該題。第二題使用0-1BFS解決單源最短路徑的問題,往往搭配雙端隊列實現。第三題是運用動態規劃解決最大不重疊子區間個數的問題,難點在于滿足3重判斷規則,所需…

Rust: 從內存地址信息看內存布局

內存布局其實有幾個:address(地址)、size(大小)、alignment(對齊位數,2 的自然數次冪,2,4,8…)。 今天主要從address來看內存的布局。 說明&…

每日一題算法——兩個數組的交集

兩個數組的交集 力扣題目鏈接 我的解法&#xff1a;利用數組下標。 缺點&#xff1a;當取值范圍很大時&#xff0c;浪費空間。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int count1[1001]{0…

c++ 互斥鎖

為練習c 線程同步&#xff0c;做了LeeCode 1114題. 按序打印&#xff1a; 給你一個類&#xff1a; public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"…

山東大學軟件學院創新項目實訓開發日志(20)之中醫知識問答自動生成對話標題bug修改

在原代碼中存在一個bug&#xff1a;當前對話的標題不是現有對話的用戶的第一段的前幾個字&#xff0c;而是歷史對話的第一段的前幾個字。 這是生成標題的邏輯出了錯誤&#xff1a; 當改成size()-1即可

WSL2-Ubuntu22.04下拉取Docker MongoDB鏡像并啟動

若未安裝docker可參考此教程&#xff1a;可以直接在wsl上安裝docker嗎&#xff0c;而不是安裝docker desktop&#xff1f;-CSDN博客 1. 拉取鏡像 docker pull mongo:latest 2.打開網絡加速&#xff0c;再次拉取鏡像 3.創建docker-compose.yml 進入vim編輯器后輸入i進行編輯&a…

中通 Redis 集群從 VM 遷移至 PVE:技術差異、PVE 優劣勢及應用場景深度解析

在數字化轉型浪潮下&#xff0c;企業對服務器資源的高效利用與成本控制愈發重視。近期&#xff0c;中通快遞將服務器上的 Redis 集群服務從 VM&#xff08;VMware 虛擬化技術&#xff09;遷移至 PVE&#xff08;Proxmox VE&#xff09;&#xff0c;這一技術舉措引發了行業廣泛關…

Prometheus+Grafana實時監控系統各項指標

一、監控架構設計 核心組件與數據流 Prometheus&#xff1a;時序數據采集、存儲與告警規則管理Node Exporter&#xff1a;采集主機指標&#xff08;CPU、內存、磁盤、網絡等&#xff09;數據庫Exporter&#xff1a;如 mysqld_exporter、postgres_exporterGrafana&#xff1a;…

[密碼學基礎]GMT 0029-2014簽名驗簽服務器技術規范深度解析

GMT 0029-2014簽名驗簽服務器技術規范深度解析 引言 在數字化轉型和網絡安全需求激增的背景下&#xff0c;密碼技術成為保障數據完整性與身份認證的核心手段。中國密碼管理局發布的GMT 0029-2014《簽名驗簽服務器技術規范》&#xff0c;為簽名驗簽服務器的設計、開發與部署提…

多路轉接select服務器

目錄 select函數原型 select服務器 select的缺點 前面介紹過多路轉接就是能同時等待多個文件描述符&#xff0c;這篇文章介紹一下多路轉接方案中的select的使用 select函數原型 #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, f…

QT6 源(45):分隔條 QSplitter 允許程序的用戶修改布局,程序員使用 IDE時,就是分隔條的用戶,以及其 QSplitter 源代碼

&#xff08;1&#xff09; &#xff08;2&#xff09;本類的繼承關系如下&#xff0c;所以說分隔條屬于容器&#xff1a; &#xff08;3&#xff09;本類的屬性&#xff1a; &#xff08;4&#xff09; 這是一份 QSplitter 的舉例代碼&#xff0c;注意其構造函數時候的傳參&am…