最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用asyncio包實現(xiàn)異步編程方式

 更新時間:2024年06月29日 11:48:05   作者:Sun_Sherry  
這篇文章主要介紹了Python使用asyncio包實現(xiàn)異步編程方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1. 異步編程

異步編程是一種編程范式,用于處理程序中需要等待異步操作完成后才能繼續(xù)執(zhí)行的情況。

異步編程允許程序在執(zhí)行耗時的操作時不被阻塞,而是在等待操作完成時繼續(xù)執(zhí)行其他任務(wù)。

這對于處理諸如文件 I/O、網(wǎng)絡(luò)請求、定時器等需要等待的操作非常有用。

使用異步編程通??梢詭硪韵潞锰帲?/p>

  • 提高程序效率和性能:異步編程使得程序在執(zhí)行耗時的 I/O 操作(如網(wǎng)絡(luò)請求、文件讀寫、數(shù)據(jù)庫查詢等)時不會被阻塞,減少了等待時間,充分利用了系統(tǒng)資源。
  • 改善用戶體驗:在 Web 開發(fā)中,異步編程可以確保服務(wù)器在處理大量并發(fā)請求時能夠快速地響應(yīng)用戶,從而提高了 Web 應(yīng)用的響應(yīng)速度和用戶體驗。

2 async/await和asyncio包

2.1 異步函數(shù)的定義

在Python中實現(xiàn)異步函數(shù)的定義需要兩個關(guān)鍵字(asyncawait)。

  • asyncasync關(guān)鍵字聲明一個異步函數(shù)。它可以在執(zhí)行過程中暫停并允許其他代碼執(zhí)行。當(dāng)你調(diào)用一個異步函數(shù)時,它會立即返回一個協(xié)程對象而不是實際的結(jié)果。異步函數(shù)適用于執(zhí)行耗時的I/O操作,例如網(wǎng)絡(luò)請求、文件讀寫、數(shù)據(jù)庫查詢等。這些操作通常涉及到等待外部資源的響應(yīng)或者數(shù)據(jù)的傳輸,而在等待的過程中,CPU可以執(zhí)行其他任務(wù),從而提高程序的效率。
  • awaitawait關(guān)鍵字在Python中用于等待一個異步操作完成。當(dāng)調(diào)用異步函數(shù)時,使用await關(guān)鍵字可以暫時掛起當(dāng)前的異步函數(shù)的執(zhí)行,將CPU控制權(quán)還給事件循環(huán)(Event Loop)。接著事件循環(huán)可以將執(zhí)行權(quán)轉(zhuǎn)移到其他任務(wù)上,而不是一直等待當(dāng)前的異步函數(shù)完成。當(dāng)被await的異步操作完成后,事件循環(huán)會通知原來的異步函數(shù),使得它可以繼續(xù)執(zhí)行后續(xù)的操作。

在Python中異步函數(shù)的定義需要同時滿足以下兩個條件:

  • 使用async def關(guān)鍵字聲明函數(shù)。
  • 函數(shù)內(nèi)部包含異步操作,并且使用了await關(guān)鍵字等待異步操作完成。如果一個函數(shù)中只使用了async def聲明,但其中任何異步操作,也沒有使用await關(guān)鍵字,那么它實際上就是一個普通的同步函數(shù),而不是一個異步函數(shù)。

2.2 事件循環(huán)

事件循環(huán)(Event Loop)是異步編程中負責(zé)管理和調(diào)度異步任務(wù)執(zhí)行的機制。

事件循環(huán)的工作原理類似于一個持續(xù)運行的循環(huán),它在每一輪循環(huán)中都會執(zhí)行以下幾個步驟:

  • 等待任務(wù)就緒: 事件循環(huán)會等待所有注冊的異步任務(wù)就緒,包括等待 I/O 操作完成、等待計時器超時等。
  • 選擇就緒任務(wù):一旦有任務(wù)就緒,事件循環(huán)會選擇其中一個任務(wù)進行執(zhí)行。
  • 執(zhí)行任務(wù):事件循環(huán)會執(zhí)行所選擇的就緒任務(wù),直到任務(wù)完成或者遇到await關(guān)鍵字,需要暫時掛起任務(wù)的執(zhí)行。
  • 掛起任務(wù):如果任務(wù)遇到await關(guān)鍵字,它會將控制權(quán)交還給事件循環(huán),并等待 await后面的異步操作完成。
  • 繼續(xù)執(zhí)行其他任務(wù):在等待await的異步操作完成的過程中,事件循環(huán)會繼續(xù)執(zhí)行其他就緒的任務(wù),從而實現(xiàn)了并發(fā)執(zhí)行的效果。
  • 異步操作完成: 當(dāng)一個 await 后面的異步操作完成后,事件循環(huán)會通知原來的任務(wù),使得它可以繼續(xù)執(zhí)行后續(xù)的操作。

2.2 asyncio包

asyncio包python中常用的異步編程框架,這里使用該框架完成一個簡單的異步編程案例,具體如下:

import time
import datetime
import asyncio
async def async_read_file():
    print("async讀文件開始:",datetime.datetime.fromtimestamp(time.time()))
    await asyncio.sleep(20)
    print("async讀文件完成:",datetime.datetime.fromtimestamp(time.time()))

def computer():
    print("普通計算密集型任務(wù):",datetime.datetime.fromtimestamp(time.time()))
    sum=0
    for i in range(1000000):
        if i%250000==0 and i!=0:
            print("普通計算密集型任務(wù)正在執(zhí)行:",datetime.datetime.fromtimestamp(time.time()))
        for j in range(500):
            sum+=i+j-2*j
    print("普通計算密集型任務(wù)完成:",datetime.datetime.fromtimestamp(time.time()))

def computer2():
    print("普通CPU密集型任務(wù):",datetime.datetime.fromtimestamp(time.time()))
    sum=0
    for i in range(1000000):
        if i%250000==0 and i!=0:
            print("普通CPU密集型任務(wù)正在執(zhí)行:",datetime.datetime.fromtimestamp(time.time()))
        for j in range(5000):
            sum+=i+j-2*j
    print("普通CPU密集型任務(wù)完成:",datetime.datetime.fromtimestamp(time.time()))

async def asy_main():
    task=loop.create_task(async_read_file()) # 創(chuàng)建一個任務(wù),并添加到事件循環(huán),等待執(zhí)行
    task2=loop.run_in_executor(None,computer)# 將普通函數(shù)read_file添加到事件循環(huán)中,等待執(zhí)行
    task3=loop.run_in_executor(None,computer2)# 將普通函數(shù)read_file2添加到事件循環(huán)中,等待執(zhí)行
    await task3
    await task2
    await task

loop=asyncio.get_event_loop() # 創(chuàng)建一個事件循環(huán)
loop.run_until_complete(asy_main())

其執(zhí)行結(jié)果如下:

普通計算密集型任務(wù): 2024-05-15 18:29:19.702689
普通CPU密集型任務(wù): 2024-05-15 18:29:19.708280
async讀文件開始: 2024-05-15 18:29:19.738654
普通計算密集型任務(wù)正在執(zhí)行: 2024-05-15 18:29:21.441072
普通計算密集型任務(wù)正在執(zhí)行: 2024-05-15 18:29:23.192585
普通計算密集型任務(wù)正在執(zhí)行: 2024-05-15 18:29:24.936979
普通計算密集型任務(wù)完成: 2024-05-15 18:29:26.712930
普通CPU密集型任務(wù)正在執(zhí)行: 2024-05-15 18:29:32.539679
async讀文件完成: 2024-05-15 18:29:39.752731
普通CPU密集型任務(wù)正在執(zhí)行: 2024-05-15 18:29:41.813872
普通CPU密集型任務(wù)正在執(zhí)行: 2024-05-15 18:29:51.103737
普通CPU密集型任務(wù)完成: 2024-05-15 18:30:00.433402

從代碼運行結(jié)果中可以看到,兩個計算密集型的任務(wù)task2、task3和異步函數(shù)task添加到事件循環(huán)上之后,在等待異步操作task完成的過程中,CPU并沒有閑著,而是在執(zhí)行task2和task3的任務(wù)。

Tips:雖然當(dāng)下的執(zhí)行結(jié)果中寫完成了computer()的計算,后完成了computer2()的計算,但多次執(zhí)行上述程序的時候也出現(xiàn)了兩個函數(shù)交替執(zhí)行的結(jié)果。

為了與上述代碼形成對比,執(zhí)行下述代碼:

import asyncio
import datetime

async def async_task(name, delay):
    print(f"Task {name} started:",datetime.datetime.now())
    await asyncio.sleep(delay)
    print(f"Task {name} finished:",datetime.datetime.now())

async def main():
    await async_task("A", 2)
    await async_task("B", 1)
    await async_task("C", 3)

asyncio.run(main())

其代碼執(zhí)行結(jié)果如下:

Task A started: 2024-05-21 17:45:24.324535
Task A finished: 2024-05-21 17:45:26.326109
Task B started: 2024-05-21 17:45:26.326250
Task B finished: 2024-05-21 17:45:27.327795
Task C started: 2024-05-21 17:45:27.327923
Task C finished: 2024-05-21 17:45:30.329475

從執(zhí)行結(jié)果上可以看到這三個異步操作是順序執(zhí)行的,并沒有同時執(zhí)行。

這是因為在執(zhí)行await后面的異步操作時事件循環(huán)中只有一個任務(wù)。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python小知識之幾種推導(dǎo)式用法示例

    Python小知識之幾種推導(dǎo)式用法示例

    Python推導(dǎo)式是一種獨特的數(shù)據(jù)處理方式,可以從一個數(shù)據(jù)序列構(gòu)建另一個新的數(shù)據(jù)序列的結(jié)構(gòu)體,下面這篇文章主要給大家介紹了關(guān)于Python小知識之幾種推導(dǎo)式用法的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Python中的 any() 函數(shù)和 all() 函數(shù)

    Python中的 any() 函數(shù)和 all() 函數(shù)

    這篇文章主要介紹了Python中的 any() 函數(shù)和 all() 函數(shù),文章基于Python的相關(guān)資料展開對 any 和 all() 函數(shù)的語法詳細內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • pytorch 模型可視化的例子

    pytorch 模型可視化的例子

    今天小編就為大家分享一篇pytorch 模型可視化的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Django rest framework如何自定義用戶表

    Django rest framework如何自定義用戶表

    Django 默認的用戶表很多時候這些基本字段不夠用,本文介紹在 DRF上使用自定義用戶表進行接口訪問控制的功能設(shè)計。感興趣的可以了解一下
    2021-06-06
  • 一文帶你了解Python中的輸入與輸出

    一文帶你了解Python中的輸入與輸出

    Python經(jīng)常需要將一些東西運行出來,這時候就需要用到輸入和輸出這兩個東西了,下面這篇文章主要給大家介紹了關(guān)于Python中輸入與輸出的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • 使用Python打造一個專業(yè)的PDF文本提取工具

    使用Python打造一個專業(yè)的PDF文本提取工具

    這篇文章主要為大家詳細介紹了如何使用Python開發(fā)一個專業(yè)的PDF文本提取工具,幫助大家從PDF文檔中高效提取結(jié)構(gòu)化文本數(shù)據(jù),適用于數(shù)據(jù)分析,內(nèi)容歸檔和知識管理等場景
    2025-07-07
  • 淺談django 重載str 方法

    淺談django 重載str 方法

    這篇文章主要介紹了淺談django 重載str 方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐

    Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐

    本文主要介紹了Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • python格式化輸出保留2位小數(shù)的實現(xiàn)方法

    python格式化輸出保留2位小數(shù)的實現(xiàn)方法

    這篇文章主要介紹了python格式化輸出保留2位小數(shù)的實現(xiàn)方法,需要的朋友可以參考下
    2019-07-07
  • Python運行的17個時新手常見錯誤小結(jié)

    Python運行的17個時新手常見錯誤小結(jié)

    當(dāng)初學(xué) Python 時,想要弄懂 Python 的錯誤信息的含義可能有點復(fù)雜。這里列出了常見的的一些讓你程序 crash 的運行時錯誤
    2012-08-08

最新評論

沙田区| 大安市| 汉川市| 阿荣旗| 拉孜县| 金寨县| 昆山市| 道孚县| 绥宁县| 剑川县| 陇南市| 岳普湖县| 凤城市| 化隆| 西乌珠穆沁旗| 温泉县| 崇礼县| 镇雄县| 中山市| 博兴县| 青州市| 全南县| 安溪县| 阿拉善右旗| 博兴县| 黔南| 调兵山市| 都昌县| 迭部县| 江华| 汾西县| 开封市| 乌鲁木齐县| 桐乡市| 六枝特区| 平乐县| 泸定县| 拉孜县| 色达县| 萨迦县| 乃东县|