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

Python協程asyncio異步編程筆記分享

 更新時間:2021年09月13日 10:56:35   作者:季布,  
這篇文章主要介紹了Python協程asyncio異步編程筆記分享,基于async & await關鍵字的協程可以實現異步編程,這也是目前python異步相關的主流技術

1.事件循環(huán)

可以理解成為一個死循環(huán),去檢查任務列表中的任務,如果可執(zhí)行就去執(zhí)行,如果檢查不到就是不可執(zhí)行的,那就忽略掉去執(zhí)行其他可執(zhí)行的任務,如果IO結束了(比如說去百度下載圖片,下載完了就會變成可執(zhí)行任務)再去執(zhí)行下載完成之后的邏輯

#這里的任務是有狀態(tài)的,比如這個任務已經完成或者正在執(zhí)行或者正在IO等待
任務列表 = [ 任務1, 任務2, 任務3,... ]
while True:
    可執(zhí)行的任務列表,已完成的任務列表 = 去任務列表中檢查所有的任務,將'可執(zhí)行'和'已完成'的任務返回
    for 就緒任務 in 可執(zhí)行的任務列表:
        執(zhí)行已就緒的任務
    for 已完成的任務 in 已完成的任務列表:
        在任務列表中移除 已完成的任務
    如果 任務列表 中的任務都已完成,則終止循環(huán)
#在編寫程序時候可以通過如下代碼來獲取和創(chuàng)建事件循環(huán)。
import asyncio
loop = asyncio.get_event_loop()
#將任務放到任務列表,讓事件循環(huán)去檢測任務的狀態(tài)(是否可運行,是否IO)
loop.loop.run_until_complete(任務)

2.協程和異步編程

協程函數,定義形式為 async def 的函數。
協程對象,調用 協程函數() 所返回的對象。

# 定義一個協程函數
async def func():
    pass
# 調用協程函數,返回一個協程對象(內部代碼不會執(zhí)行)
result = func()

2.1 基本使用

程序中,如果想要執(zhí)行協程函數的內部代碼,需要 事件循環(huán) 和 協程對象 配合才能實現
示例1:

import asyncio
async def func():
    print("協程內部代碼")
# 調用協程函數,返回一個協程對象。
result = func()
# 方式一
# loop = asyncio.get_event_loop() # 創(chuàng)建一個事件循環(huán)
# loop.run_until_complete(result) # 將協程當做任務提交到事件循環(huán)的任務列表中,協程執(zhí)行完成之后終止。
# 方式二
# 本質上方式一是一樣的,內部先 創(chuàng)建事件循環(huán) 然后執(zhí)行 run_until_complete,一個簡便的寫法。
# asyncio.run 函數在 Python 3.7 中加入 asyncio 模塊,
asyncio.run(result)

2.2 await

await+可等待對象(協程對象,Future,Task對象)
await是一個只能在協程函數中使用的關鍵字,用于遇到IO操作時掛起 當前協程(任務),當前協程(任務)掛起過程中 事件循環(huán)可以去執(zhí)行其他的協程(任務),當前協程IO處理完成時,可以再次切換回來執(zhí)行await之后的代碼。

import asyncio
async def func():
    print("執(zhí)行協程函數內部代碼")
    # 遇到IO操作掛起當前協程(任務),等IO操作完成之后再繼續(xù)往下執(zhí)行。
    # 當前協程掛起時,事件循環(huán)可以去執(zhí)行其他協程(任務)。
	#response是IO耗時結束后拿到的結果
    response = await asyncio.sleep(2)
    print("IO請求結束,結果為:", response)
result = func()
asyncio.run(result)


結果
執(zhí)行協程函數內部代碼
IO請求結束,結果為: None
#這里返回None表示這個好事沒有啥意義,如果你是下載了一張圖片成功后會返回一個結果

示例2:

import asyncio
async def others():
    print("start")
    await asyncio.sleep(2)
    print('end')
    return '返回值'
async def func():
    print("執(zhí)行協程函數內部代碼")
    # 遇到IO操作掛起當前協程(任務),等IO操作完成之后再繼續(xù)往下執(zhí)行。當前協程掛起時,事件循環(huán)可以去執(zhí)行其他協程(任務)。
    response = await others()
    print("IO請求結束,結果為:", response)
asyncio.run( func() )

執(zhí)行結果:
執(zhí)行協程函數內部代碼
start
end
IO請求結束,結果為: 返回值

示例3:

import asyncio
async def others():
    print("start")
    await asyncio.sleep(2)
    print('end')
    return '返回值'
async def func():
    print("執(zhí)行協程函數內部代碼")
    # 遇到IO操作掛起當前協程(任務),等IO操作完成之后再繼續(xù)往下執(zhí)行。當前協程掛起時,事件循環(huán)可以去執(zhí)行其他協程(任務)。
    #await等待有返回值才會向下執(zhí)行
    response1 = await others()
    print("IO請求結束,結果為:", response1)
    response2 = await others()
    print("IO請求結束,結果為:", response2)
asyncio.run( func() )

執(zhí)行結果:
執(zhí)行協程函數內部代碼
start
end
IO請求結束,結果為: 返回值
start
end
IO請求結束,結果為: 返回值

下一步依賴上一步的結果時使用await,但如果有其他任務依然會切換到其他任務去執(zhí)行

2.3 Task對象

在事件循環(huán)中添加多個任務。
Tasks用于并發(fā)調度協程,通過asyncio.create_task(協程對象)的方式創(chuàng)建Task對象,這樣可以讓協程加入事件循環(huán)中等待被調度執(zhí)行。

除了使用 asyncio.create_task() 函數以外,還可以用低層級的 loop.create_task() 或 ensure_future() 函數。

不建議手動實例化 Task 對象。

本質上是將協程對象封裝成task對象,并將協程立即加入事件循環(huán),同時追蹤協程的狀態(tài)。
注意:asyncio.create_task() 函數在 Python 3.7 中被加入。

在 Python 3.7 之前,可以改用低層級的 asyncio.ensure_future() 函數。

示例1:

import asyncio
async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return "返回值"
async def main():
    print("main開始")
    # 創(chuàng)建協程,將協程封裝到一個Task對象中并立即添加到事件循環(huán)的任務列表中,等待事件循環(huán)去執(zhí)行(默認是就緒狀態(tài))。
    task1 = asyncio.create_task(func())
    # 創(chuàng)建協程,將協程封裝到一個Task對象中并立即添加到事件循環(huán)的任務列表中,等待事件循環(huán)去執(zhí)行(默認是就緒狀態(tài))。
    task2 = asyncio.create_task(func())
    print("main結束")
    # 當執(zhí)行某協程遇到IO操作時,會自動化切換執(zhí)行其他任務。
    # 此處的await是等待相對應的協程全都執(zhí)行完畢并獲取結果
    ret1 = await task1
    ret2 = await task2
    print(ret1, ret2)
asyncio.run(main())

執(zhí)行結果:
main開始
main結束
1
1
2
2
返回值 返回值

實例2:

import asyncio
async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return "返回值"
async def main():
    print("main開始")
    # 創(chuàng)建協程,將協程封裝到Task對象中并添加到事件循環(huán)的任務列表中,等待事件循環(huán)去執(zhí)行(默認是就緒狀態(tài))。
    # 在調用
    task_list = [
        asyncio.create_task(func(), name="n1"),
        asyncio.create_task(func(), name="n2")
    ]
    print("main結束")
    # 當執(zhí)行某協程遇到IO操作時,會自動化切換執(zhí)行其他任務。
    # 此處的await是等待所有協程執(zhí)行完畢,并將所有協程的返回值保存到done
    # 如果設置了timeout值,則意味著此處最多等待的秒,完成的協程返回值寫入到done中,未完成則寫到pending中(比如下面的Timeout=1,要下載的圖片是兩秒,設為1秒就會執(zhí)行失敗,done內為空,而pending中就是執(zhí)行失敗的)。
    done, pending = await asyncio.wait(task_list, timeout=None)
    print(done, pending)
asyncio.run(main())

執(zhí)行結果:
main開始
main結束
1
1
2
2
{
   <Task finished name='n1' coro=<func() done, defined at C:/Users/xuan.li/Desktop/unidevopss/py3x64/ibuildmaster/apps/PROD/tests.py:513> result='返回值'>,
   <Task finished name='n2' coro=<func() done, defined at C:/Users/xuan.li/Desktop/unidevopss/py3x64/ibuildmaster/apps/PROD/tests.py:513> result='返回值'>
}
 set()

示例3:

import asyncio
async def func():
    print("執(zhí)行協程函數內部代碼")
    # 遇到IO操作掛起當前協程(任務),等IO操作完成之后再繼續(xù)往下執(zhí)行。當前協程掛起時,事件循環(huán)可以去執(zhí)行其他協程(任務)。
    response = await asyncio.sleep(2)
    print("IO請求結束,結果為:", response)
coroutine_list = [func(), func()]
# 錯誤:coroutine_list = [ asyncio.create_task(func()), asyncio.create_task(func()) ]  
# 此處不能直接 asyncio.create_task,因為將Task立即加入到事件循環(huán)的任務列表,
# 但此時事件循環(huán)還未創(chuàng)建,所以會報錯。
# 使用asyncio.wait將列表封裝為一個協程,并調用asyncio.run實現執(zhí)行兩個協程
# asyncio.wait內部會對列表中的每個協程執(zhí)行ensure_future,封裝為Task對象。
done,pending = asyncio.run( asyncio.wait(coroutine_list) )

以上就是Python協程asyncio 異步編程筆記分享的詳細內容,更多關于Python協程asyncio 異步編程的資料請關注腳本之家其它相關文章!

相關文章

  • Python-OpenCV基本操作方法詳解

    Python-OpenCV基本操作方法詳解

    下面小編就為大家分享一篇Python-OpenCV基本操作方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 基于Python實現一個多分類的Logistic回歸模型的代碼示例

    基于Python實現一個多分類的Logistic回歸模型的代碼示例

    在機器學習中,Logistic回歸是一種基本但非常有效的分類算法,它不僅可以用于二分類問題,還可以擴展應用于多分類問題,本文將詳細介紹如何使用Python實現一個多分類的Logistic回歸模型,并給出詳細的代碼示例,需要的朋友可以參考下
    2025-01-01
  • Python?shapely庫的具體使用

    Python?shapely庫的具體使用

    本文主要介紹了Python?shapely庫的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SVM基本概念及Python實現代碼

    SVM基本概念及Python實現代碼

    這篇文章主要為大家詳細介紹了SVM基本概念及Python實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 在Python的列表中利用remove()方法刪除元素的教程

    在Python的列表中利用remove()方法刪除元素的教程

    這篇文章主要介紹了在Python的列表中利用remove()方法刪除元素的教程,是Python入門中的基礎知識,注意其和pop()方法的區(qū)別,需要的朋友可以參考下
    2015-05-05
  • Python實現簡單掃雷游戲

    Python實現簡單掃雷游戲

    這篇文章主要為大家詳細介紹了Python實現簡單掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Python3中正則模塊re.compile、re.match及re.search函數用法詳解

    Python3中正則模塊re.compile、re.match及re.search函數用法詳解

    這篇文章主要介紹了Python3中正則模塊re.compile、re.match及re.search函數用法,結合實例形式較為詳細的分析了re模塊 中re.compile、re.match及re.search函數的功能、參數、具體使用技巧與注意事項,需要的朋友可以參考下
    2018-06-06
  • Python使用K-means實現文本聚類功能

    Python使用K-means實現文本聚類功能

    最近遇到了這樣一個需求,將N個文本內容聚類成若干個主題詞團,減少人工分析文本和分類文本的工作量,實現思路是使用?K-means算法通過高頻詞對文本內容進行聚類,K-means算法實現原理簡單易于理解,本文給大家介紹了Python使用K-means實現文本聚類功能,需要的朋友可以參考下
    2024-11-11
  • nlp自然語言處理基于SVD的降維優(yōu)化學習

    nlp自然語言處理基于SVD的降維優(yōu)化學習

    這篇文章主要為大家介紹了nlp自然語言處理基于SVD的降維優(yōu)化學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • PyQt5每天必學之布局管理

    PyQt5每天必學之布局管理

    這篇文章主要為大家詳細介紹了PyQt5每天必學之布局管理的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04

最新評論