欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python協(xié)程異步IO中asyncio的使用

 更新時間:2023年12月30日 10:53:16   作者:金色旭光  
這篇文章主要介紹了python異步編程之a(chǎn)syncio的使用,python中異步IO操作是通過asyncio來實現(xiàn)的,為了更加詳細說明asyncio,我們先從協(xié)程的最基礎開始講解

async await介紹

用asyncio提供的@asyncio.coroutine可以把一個生成器標記為協(xié)程類型,然后在協(xié)程內(nèi)部用yield from 等待IO操作,讓出cpu執(zhí)行權(quán)。
然而異步的關(guān)鍵字yield 和 yield from畢竟是復用生成器關(guān)鍵字,兩者在概念上糾纏不清,所以從Python 3.5開始引入了新的語法async和await替換yield 和 yield from,讓協(xié)程的代碼更易懂。
簡單來說,可以這樣理解:

  • async 替換 @asyncio.coroutine:標識一個函數(shù)為異步函數(shù)
  • await 替換 yield from:標識等待IO操作,讓出CPU執(zhí)行權(quán)

async實現(xiàn)協(xié)程示例 

由于協(xié)程在各個python版本中有細微差異,本篇以python3.10為例

import asyncio
async def coro1():
    print("start coro1")
    await asyncio.sleep(2)
    print("end coro1")
async def coro2():
    print("start coro2")
    await asyncio.sleep(1)
    print("end coro2")
# 創(chuàng)建事件循環(huán)
loop = asyncio.get_event_loop()
# 創(chuàng)建任務
task1 = loop.create_task(coro1())
task2 = loop.create_task(coro2())
# 運行協(xié)程
loop.run_until_complete(asyncio.gather(task1, task2))
# 關(guān)閉事件循環(huán)
loop.close()

輸出結(jié)果:

start coro1
start coro2
end coro2
end coro1

代碼邏輯:

  • 創(chuàng)建一個事件循環(huán)
  • 將兩個異步函數(shù)coro1,coro2封裝成兩個任務task1,task2
  • 用asyncio.gather將兩個任務組合到一起,并發(fā)執(zhí)行task1,task2
  • 先執(zhí)行task1,遇到IO切換到task2
  • 執(zhí)行task2,遇到IO切換,但此時沒有等待執(zhí)行的任務,cpu為空
  • task2執(zhí)行完成,task1執(zhí)行完成

從示例代碼可以看出,協(xié)程的幾個關(guān)鍵要素:

  • 事件循環(huán)
  • 協(xié)程函數(shù)定義
  • 可等待對象
  • 并發(fā)執(zhí)行

協(xié)程基本原理

組成協(xié)程最重要的因素就是事件循環(huán)和任務。

  • 任務就是一個對象,包括執(zhí)行的代碼,執(zhí)行完成、失敗等狀態(tài)以及返回結(jié)果,任務中通常會有IO切換。
  • 事件循環(huán),可以把它當做是一個while循環(huán)。while循環(huán)在周期性的運行并執(zhí)行一些任務,所有任務執(zhí)行完成會關(guān)閉循環(huán)。

偽代碼示例如下:

任務列表 = [ 任務1, 任務2, 任務3,... ]

while True:
    可執(zhí)行的任務列表,已完成的任務列表 = 去任務列表中檢查所有的任務,將'可執(zhí)行'和'已完成'的任務返回
    for 就緒任務 in 已準備就緒的任務列表:
        執(zhí)行已就緒的任務
    for 已完成的任務 in 已完成的任務列表:
        在任務列表中移除 已完成的任務

    如果 任務列表 中的任務都已完成,則終止循環(huán)

獲取和創(chuàng)建事件循環(huán):loop = asyncio.get_event_loop()

驅(qū)動事件循環(huán)運行:loop.run_until_complete(asyncio.gather(task1, task2))

事件循環(huán)過程:

事件循環(huán)中執(zhí)行任務,當執(zhí)行到某一個任務時遇到IO時,協(xié)程會讓出CPU給第二個任務執(zhí)行,第二個任務中遇到IO再次讓出CPU,直到所有任務完成。這就是協(xié)程并發(fā)性能好的一個關(guān)鍵能力:遇到IO切換任務執(zhí)行,避免了程序等待IO完成再執(zhí)行的耗時。

示例代碼的高級api實現(xiàn)

示例代碼中使用了asyncio.get_event_loop()和 loop.run_until_complete()等代碼,這些其實asyncio包的低級API,是為了展示底層原理而使用的。通常更推薦高級APIasyncio.run()實現(xiàn)協(xié)程并發(fā)。

import asyncio
async def coro1():
    print("start coro1")
    await asyncio.sleep(2)
    print("end coro1")
async def coro2():
    print("start coro2")
    await asyncio.sleep(1)
    print("end coro2")
async def main():
    task1 = asyncio.create_task(coro1())
    task2 = asyncio.create_task(coro2())
    await asyncio.gather(task1, task2)
asyncio.run(main())

run() 從功能上等價于以下低階API

loop = asyncio.get_event_loop()
task = loop.create_task(coro())
loop.run_until_complete(task)

為什么協(xié)程在IO密集時性能較好

很多人可能會疑問,多線程遇到IO也會切換,為什么協(xié)程比線程性能好呢?

簡單來是三點:

  • 協(xié)程更輕量級,切換需要恢復的上下文很少,所以比線程更快速
  • 線程切換CPU是搶占的,協(xié)程是主動讓出的,協(xié)程對CPU的使用更充分
  • 協(xié)程更輕量級,啟動線程需要的內(nèi)存資源比協(xié)程更多

以上就是python協(xié)程異步IO中asyncio的使用的詳細內(nèi)容,更多關(guān)于python asyncio的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實現(xiàn)TCP協(xié)議下的端口映射功能的腳本程序示例

    Python實現(xiàn)TCP協(xié)議下的端口映射功能的腳本程序示例

    端口映射一個最基本的運作形態(tài)就是通過一個中間端口將一個端口發(fā)送的數(shù)據(jù)全部轉(zhuǎn)給另一個端口,well,這里我們就來看一下Python實現(xiàn)TCP協(xié)議下的端口映射功能的腳本程序示例
    2016-06-06
  • Python實現(xiàn)定時文件備份到指定文件夾

    Python實現(xiàn)定時文件備份到指定文件夾

    隨著數(shù)據(jù)的不斷增長,文件備份變得越來越重要,本文將介紹如何使用Python編寫一個定時備份文件的腳本,并將文件備份到指定的文件夾中,希望對大家有所幫助
    2024-11-11
  • Python如何使用Scapy實現(xiàn)端口探測

    Python如何使用Scapy實現(xiàn)端口探測

    Scapy 是一款使用純Python編寫的跨平臺網(wǎng)絡數(shù)據(jù)包操控工具,它能夠處理和嗅探各種網(wǎng)絡數(shù)據(jù)包,本文主要介紹了Python如何使用使用Scapy實現(xiàn)端口探測,有需要的可以參考下
    2023-10-10
  • Python操作mysql數(shù)據(jù)庫實現(xiàn)增刪查改功能的方法

    Python操作mysql數(shù)據(jù)庫實現(xiàn)增刪查改功能的方法

    這篇文章主要介紹了Python操作mysql數(shù)據(jù)庫實現(xiàn)增刪查改功能的方法,涉及Python針對mysql數(shù)據(jù)庫的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 使用python提取PowerPoint幻燈片中表格并保存到文本及Excel文件

    使用python提取PowerPoint幻燈片中表格并保存到文本及Excel文件

    owerPoint作為廣泛使用的演示工具,常被用于展示各類數(shù)據(jù)報告和分析結(jié)果,其中,表格以其直觀性和結(jié)構(gòu)性成為闡述數(shù)據(jù)關(guān)系的不二之選,本文將介紹如何使用Python來提取PowerPoint幻燈片中的表格,并將表格數(shù)據(jù)寫入文本文件以及Excel文件,需要的朋友可以參考下
    2024-06-06
  • 使用pytorch提取卷積神經(jīng)網(wǎng)絡的特征圖可視化

    使用pytorch提取卷積神經(jīng)網(wǎng)絡的特征圖可視化

    這篇文章主要給大家介紹了關(guān)于使用pytorch提取卷積神經(jīng)網(wǎng)絡的特征圖可視化的相關(guān)資料,文中給出了詳細的思路以及示例代碼,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • Python面經(jīng)之16個高頻面試問題總結(jié)

    Python面經(jīng)之16個高頻面試問題總結(jié)

    這篇文章主要給大家介紹了關(guān)于Python面經(jīng)之16個高頻面試問題的相關(guān)資料,幫助大家回顧基礎知識,了解面試套路,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • python中常用的數(shù)據(jù)結(jié)構(gòu)介紹

    python中常用的數(shù)據(jù)結(jié)構(gòu)介紹

    這篇文章主要介紹了python中常用的數(shù)據(jù)結(jié)構(gòu)介紹,幫助大家更好的理解和學習python的基礎知識,感興趣的朋友可以了解下
    2021-01-01
  • Python使用MySQL8.2讀寫分離實現(xiàn)示例詳解

    Python使用MySQL8.2讀寫分離實現(xiàn)示例詳解

    在這篇文章中,我們將了解如何將?MySQL?8.2?的讀寫分離功能與?MySQL-Connector/Python?一起使用的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 淺談Python基礎—判斷和循環(huán)

    淺談Python基礎—判斷和循環(huán)

    這篇文章主要介紹了Python基礎—判斷和循環(huán),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03

最新評論