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

Python協(xié)程asyncio異步編程筆記分享

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

1.事件循環(huán)

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

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

2.協(xié)程和異步編程

協(xié)程函數(shù),定義形式為 async def 的函數(shù)。
協(xié)程對象,調(diào)用 協(xié)程函數(shù)() 所返回的對象。

# 定義一個協(xié)程函數(shù)
async def func():
    pass
# 調(diào)用協(xié)程函數(shù),返回一個協(xié)程對象(內(nèi)部代碼不會執(zhí)行)
result = func()

2.1 基本使用

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

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

2.2 await

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

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


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

示例2:

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

執(zhí)行結(jié)果:
執(zhí)行協(xié)程函數(shù)內(nèi)部代碼
start
end
IO請求結(jié)束,結(jié)果為: 返回值

示例3:

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

執(zhí)行結(jié)果:
執(zhí)行協(xié)程函數(shù)內(nèi)部代碼
start
end
IO請求結(jié)束,結(jié)果為: 返回值
start
end
IO請求結(jié)束,結(jié)果為: 返回值

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

2.3 Task對象

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

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

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

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

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

示例1:

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

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

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

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

相關(guān)文章

  • Python調(diào)用olmOCR大模型實現(xiàn)提取復(fù)雜PDF文件內(nèi)容

    Python調(diào)用olmOCR大模型實現(xiàn)提取復(fù)雜PDF文件內(nèi)容

    olmocr是由Allen人工智能研究所(AI2)開發(fā)的一個開源工具包,旨在高效地將PDF和其他文檔轉(zhuǎn)換為結(jié)構(gòu)化的純文本,同時保持自然閱讀順序,下面我們來看看如何使用olmOCR大模型實現(xiàn)提取復(fù)雜PDF文件內(nèi)容吧
    2025-03-03
  • python基于paramiko將文件上傳到服務(wù)器代碼實現(xiàn)

    python基于paramiko將文件上傳到服務(wù)器代碼實現(xiàn)

    這篇文章主要介紹了python基于paramiko將文件上傳到服務(wù)器代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • python程序 線程隊列queue使用方法解析

    python程序 線程隊列queue使用方法解析

    這篇文章主要介紹了python程序 線程隊列queue使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • 使用Python為Excel文件添加預(yù)設(shè)和自定義文檔屬性

    使用Python為Excel文件添加預(yù)設(shè)和自定義文檔屬性

    向Excel文件添加文檔屬性是專業(yè)地組織和管理電子表格數(shù)據(jù)的關(guān)鍵步驟,這些屬性,如標題、作者、主題和關(guān)鍵詞,增強了文件的元數(shù)據(jù),使得在大型數(shù)據(jù)庫或文件系統(tǒng)中跟蹤變得更加容易,本文將介紹如何使用Python高效地為Excel文件添加文檔屬性,需要的朋友可以參考下
    2024-05-05
  • Python的3種運行方式:命令行窗口、Python解釋器、IDLE的實現(xiàn)

    Python的3種運行方式:命令行窗口、Python解釋器、IDLE的實現(xiàn)

    這篇文章主要介紹了Python的3種運行方式:命令行窗口、Python解釋器、IDLE的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • python 實現(xiàn)將字典dict、列表list中的中文正常顯示方法

    python 實現(xiàn)將字典dict、列表list中的中文正常顯示方法

    今天小編就為大家分享一篇python 實現(xiàn)將字典dict、列表list中的中文正常顯示方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 部署django項目安裝uwsgi出錯的解決方法總結(jié)

    部署django項目安裝uwsgi出錯的解決方法總結(jié)

    uwsgi協(xié)議是一個uWSGI服務(wù)器自有的協(xié)議,它用于定義傳輸信息的類型(type of information),每一個uwsgi packet前4byte為傳輸信息類型描述,它與WSGI相比是兩樣?xùn)|西,下面這篇文章主要給大家介紹了關(guān)于部署django項目安裝uwsgi出錯的解決方法,需要的朋友可以參考下
    2022-08-08
  • Python面向?qū)ο筇厥獬蓡T

    Python面向?qū)ο筇厥獬蓡T

    這篇文章主要介紹了Python面向?qū)ο筇厥獬蓡T的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 使用Python編寫自己的微型Redis

    使用Python編寫自己的微型Redis

    這篇文章主要為大家詳細介紹了使用Python編寫自己的微型Redis的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2024-03-03
  • pypy提升python項目性能使用詳解

    pypy提升python項目性能使用詳解

    這篇文章主要為大家介紹了pypy提升python項目性能使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

新干县| 香港 | 平利县| 钟山县| 刚察县| 东台市| 夏邑县| 资溪县| 桦川县| 郸城县| 元朗区| 新竹市| 上林县| 平南县| 眉山市| 柳林县| 大足县| 修水县| 合作市| 宁远县| 高邮市| 县级市| 寻乌县| 鹤岗市| 绩溪县| 武威市| 宁津县| 阿图什市| 宕昌县| 义乌市| 师宗县| 云霄县| 津市市| 隆子县| 延津县| 许昌县| 辉县市| 都江堰市| 甘德县| 西乡县| 前郭尔|