python asyncio 的基本使用

1、引言

asyncio 是 Python 標準庫中的一個庫,提供了對異步 I/O 、事件循環、協程和任務等異步編程模型的支持。

asyncio 文檔

2、進程、線程、協程

  • 線程

    線程是操作系統調度的基本單位,同一個進程中的多個線程共享相同的內存空間。線程之間的切換由操作系統內核負責。

    特點:共享同一資源空間,切換時有開銷,但比進程小,適合 I/O 密集型任務,需要管理資源競爭問題。

  • 進程

    進程是操作系統資源分配的基本單位,每個進程有獨立的內存空間,進程之間不能共享內存,需要通過進程間通信(IPC)。

    特點:任務完全獨立,互不干擾,各自有自己的資源,切換時開銷較大,適合 CPU 密集型任務。

  • 協程

    協程是由程序自身調度的函數,可以在執行過程中暫停和恢復,協程的切換由程序自身完成,而不是依賴操作系統。

    特點:單線程內管理多任務,沒有線程切換的開銷,適合 I/O 密集型任務,需要程序自己管理任務的切換。

3 、asyncio 的基本使用

3.1 異步函數 和 await

異步函數使用 async def 聲明,await 關鍵字用于等待一個 異步操作完成。

代碼案例

import asyncioasync def hello():print("Hello")await asyncio.sleep(2)print("World")asyncio.run(hello())

注意

  • async 聲明后,不能直接 say_hello 運行函數
  • 現在運行還是會 等待 1s 后執行 print(“World”)
  • 協成本質上是事件循環。不是說用了 async await 就會成異步,是需要程序員自己定義任務有哪些協程的。

3.2 任務(Tasks)

任務用于調度和管理協程的執行。

代碼示例

import asyncioasync def greet(name):print(f"Hello, {name}")await asyncio.sleep(2)print(f"GoodBye: {name}")async def main():task1 = asyncio.create_task(greet("Tom"))task2 = asyncio.create_task(greet("Jerry"))await task1await task2asyncio.run(main())"""
輸出:
Hello, Tom
Hello, Jerry
GoodBye: Tom
GoodBye: Jerry
"""

4、本質

4.1 協程

協程是可以暫停和恢復的函數。與傳統的函數不同,協程可以在執行過程中暫停,以便其他協程可以運行。Python 使用 async def 聲明協程函數,使用 await 暫停協程的執行。

4.2 事件循環

事件循環是 asyncio 的核心,用于調度 和執行協程。事件循環負責處理異步函數、I/O 事件、定時器等。

4.3 任務 和 Future

任務是協程的高級抽象,用于調度協程的執行。Future 是表示異步操作結果的低級抽象,可以與任務一起使用。

5、高級使用

5.1 混合同步與異步IO

演示如何在異步環境中調用同步函數。

import asyncio# 同步函數
def sync_function():print("執行同步函數")# 異步函數
async def async_function():print("開始執行異步函數")await asyncio.sleep(2)  # 模擬異步操作print("異步函數執行完成")# 在異步環境中調用同步函數
async def main():loop = asyncio.get_event_loop()await loop.run_in_executor(None, sync_function)await async_function()asyncio.run(main())"""
輸出
執行同步函數
開始執行異步函數
異步函數執行完成
"""

5.2 異步 I/O 中高級處理

import asyncioasync def my_async_function():try:await asyncio.wait_for(asyncio.sleep(5), timeout=3)except asyncio.TimeoutError:print("異步操作超時")asyncio.run(my_async_function())

5.3 異步I/O 中并發限制

有時候,為了避免資源耗盡,需要限制并發任務的數量。Asyncio提供了Semaphore來限制并發量。

asyncio.gather 是 Python 的 asyncio 模塊中的一個函數,用于并發運行多個異步任務并收集它們的結果。它允許你將多個協程(或可等待對象)打包在一起,并并發地執行它們。

import asyncioasync def limited_task(sem, num):async with sem:print(f"開始執行任務 {num}")await asyncio.sleep(2)print(f"任務 {num} 執行完成")async def main():sem = asyncio.Semaphore(5)tasks = [limited_task(sem, i) for i in range(10)]await asyncio.gather(*tasks)asyncio.run(main())

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

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

相關文章

Leedcode刷題 | Day30_貪心算法04

一、學習任務 452. 用最少數量的箭引爆氣球代碼隨想錄435. 無重疊區間763. 劃分字母區間 二、具體題目 1.452用最少數量的箭引爆氣球452. 用最少數量的箭引爆氣球 - 力扣(LeetCode) 在二維空間中有許多球形的氣球。對于每個氣球,提供的輸…

Ant Design Vue 表格復雜數據合并單元格

Ant Design Vue 表格復雜數據合并單元格 官方合并效果 官方示例 表頭只支持列合并&#xff0c;使用 column 里的 colSpan 進行設置。 表格支持行/列合并&#xff0c;使用 render 里的單元格屬性 colSpan 或者 rowSpan 設值為 0 時&#xff0c;設置的表格不會渲染。 <temp…

C++ 標準庫中的 <algorithm> 頭文件算法總結

C 常用 <algorithm> 算法概覽 C 標準庫中的 <algorithm> 頭文件提供了大量有用的算法&#xff0c;主要用于操作容器&#xff08;如 vector, list, array 等&#xff09;。這些算法通常通過迭代器來操作容器元素。 1. 非修改序列操作 std::all_of, std::any_of, s…

程序化廣告行業(84/89):4A廣告代理公司與行業資質解讀

程序化廣告行業&#xff08;84/89&#xff09;&#xff1a;4A廣告代理公司與行業資質解讀 大家好&#xff01;在探索程序化廣告行業的道路上&#xff0c;每一次知識的分享都是我們共同進步的階梯。一直以來&#xff0c;我都希望能和大家攜手前行&#xff0c;深入了解這個充滿機…

deepin使用autokey添加微信快捷鍵一鍵顯隱ctrl+alt+w

打開deepin商店&#xff0c;搜索快捷鍵&#xff0c;找到autokey 快捷鍵管理&#xff0c;點擊安裝 點擊右鍵新建文件夾 點擊右鍵新建腳本 打開腳本并添加以下內容 import subprocess import time# ------------------ 配置項 ------------------ WM_CLASS "wechat…

文件內容課堂總結

Spark SQL是Spark用于結構化數據處理的模塊&#xff0c;前身是Shark。Shark基于Hive開發&#xff0c;雖提升了SQL-on-Hadoop效率&#xff0c;但對Hive依賴過多。2014年6月1日Shark項目停止開發&#xff0c;團隊將資源投入Spark SQL項目。Spark SQL具有諸多優點&#xff0c;如擺…

Zotero PDF Translate 翻譯插件使用OpenAI API配置教程

PDF Translate&#xff1a;提升 Zotero 內置 PDF 閱讀器的翻譯功能 “PDF Translate” 是一款為 Zotero 設計的插件&#xff0c;旨在方便用戶在 Zotero 內置的 PDF 閱讀器中進行劃詞或段落翻譯&#xff0c;輔助閱讀外文文獻。 一、 安裝插件 下載插件&#xff1a; 訪問 PDF T…

火山引擎旗下的產品

用戶問的是火山引擎旗下的產品&#xff0c;我需要詳細列出各個類別下的產品。首先&#xff0c;我得確認火山引擎有哪些主要業務領域&#xff0c;比如云計算、大數據、人工智能這些。然后&#xff0c;每個領域下具體有哪些產品呢&#xff1f;比如云計算方面可能有云服務器、容器…

C/C++程序中實現Python綁定多種技術路線

在C/C程序中實現Python綁定有多種技術路線&#xff0c;選擇合適的方法取決于項目需求、性能要求和開發效率。以下是常見的幾種方案&#xff0c;按易用性排序&#xff1a; 1. PyBind11&#xff08;推薦首選&#xff09; 特點&#xff1a;現代C庫&#xff0c;語法簡潔&#xff0…

【位運算】消失的兩個數字

文章目錄 面試題 17.19. 消失的兩個數字解題思路 面試題 17.19. 消失的兩個數字 面試題 17.19. 消失的兩個數字 ? 給定一個數組&#xff0c;包含從 1 到 N 所有的整數&#xff0c;但其中缺了兩個數字。你能在 O(N) 時間內只用 O(1) 的空間找到它們嗎&#xff1f; ? 以任意…

自然語言處理Hugging Face Transformers

Hugging Face Transformers 是一個基于 PyTorch 和 TensorFlow 的開源庫&#xff0c;專注于 最先進的自然語言處理&#xff08;NLP&#xff09;模型&#xff0c;如 BERT、GPT、RoBERTa、T5 等。它提供了 預訓練模型、微調工具和推理 API&#xff0c;廣泛應用于文本分類、機器翻…

vue開發基礎流程 (后20)

創建項目命令&#xff1b; 或者 vue create my - vue - router - project這個是創建帶路由的項目 22.組件組成 比如說一個頁面吧&#xff0c;他三個組件&#xff0c;template就是用來放所有的標簽&#xff0c;script用來放業務邏輯&#xff0c;style用來放樣式&#xff0c;c…

高性能內存kv數據庫Redis

引言 在當今數據驅動的時代&#xff0c;高效的數據存儲和檢索對于各類應用程序至關重要。Redis&#xff08;Remote Dictionary Server&#xff09;作為一款開源的內存鍵值數據庫&#xff0c;憑借其出色的性能、豐富的數據結構和靈活的特性&#xff0c;在眾多場景中得到了廣泛應…

自動化測試概念篇

文章目錄 目錄1. 自動化1.1 自動化概念1.1.1 回歸測試 1.2 自動化分類1.3 自動化測試金字塔 2. web自動化測試2.1 驅動2.1.1 安裝驅動管理2.1.2 selenium庫 3. Selenium3.1 一個簡單的web自動化示例3.2 selenium驅動瀏覽器的工作原理 目錄 自動化web自動化測試Selenium 1. 自…

《AI大模型應知應會100篇》第17篇:大模型的偏見與公平性問題

第17篇&#xff1a;大模型的偏見與公平性問題 摘要 在人工智能迅速發展的今天&#xff0c;大型語言模型&#xff08;LLM&#xff09;已經深入到我們的日常生活和工作中。然而&#xff0c;這些模型并非完美無缺&#xff0c;它們可能攜帶并放大數據中的偏見&#xff0c;導致不公…

【踩坑】GitHub Actions 運行的 Linux 環境中,文件名是大小寫敏感的

在使用 VuePress 搭建個人博客并部署到 GitHub Pages 的過程中&#xff0c;我遇到了一個頗為棘手的問題&#xff1a;本地打包一切正常&#xff0c;但在 GitHub Actions 自動執行打包流程時&#xff0c;卻提示找不到 README.md 文件&#xff0c;導致整個流程失敗。經過一番深入排…

C# 13新特性 - .NET 9

轉載&#xff1a; C# 13 中的新增功能 | Microsoft Learn C# 13 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 SDK 嘗試這些功能&#xff1a;Introduced in Visual Studio 2022 Version 17.12 and newer when using C# 13 C# 13 中的新增功能 | Micr…

numpy.ma.masked_where:屏蔽滿足條件的數組

1.函數功能 屏蔽滿足條件的數組內容&#xff0c;返回值為掩碼數組 2.語法結構 np.ma.masked_where(condition, a, copyTrue)3. 參數 參數含義condition屏蔽條件a要操作的數組copy布爾值&#xff0c;取值為True時&#xff0c;結果復制數組(原始數據不變)&#xff0c;否則返回…

【Redis】數據結構和內部編碼

先來復習一下之前學過的幾個基本的全局命令&#xff1a; keys&#xff1a;用來查看匹配規則的keyexists&#xff1a;用來判定執行key是否存在del&#xff1a;刪除指定的keyexpire&#xff1a;給key設置過期時間ttl&#xff1a;查詢key的過期時間type&#xff1a;查詢key對應的…

OBOO鷗柏如何以智能教育室內外觸摸屏一體機AI變革硬件

在AI技術蓬勃發展的當下&#xff0c;OBOO鷗柏室外觸摸屏一體機通過融入AI科技&#xff0c;為教育領域帶來了翻天覆地的變化。這款一體機不僅為高校和大學校園提供了革命性的數字化教學解決方案&#xff0c;更引領了引體向上成績提升一體機帶訓室外終端屏幕設備的新潮流。其創新…