婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python協程asyncio模塊的演變及高級用法

Python協程asyncio模塊的演變及高級用法

熱門標簽:沈陽防封電銷卡品牌 武漢外呼系統平臺 江西省地圖標注 池州外呼調研線路 沈陽外呼系統呼叫系統 外呼系統哪些好辦 富錦商家地圖標注 沈陽人工外呼系統價格 如何申請400電話費用

Python協程及asyncio基礎知識

協程(coroutine)也叫微線程,是實現多任務的另一種方式,是比線程更小的執行單元,一般運行在單進程和單線程上。因為它自帶CPU的上下文,它可以通過簡單的事件循環切換任務,比進程和線程的切換效率更高,這是因為進程和線程的切換由操作系統進行。

Python實現協程的主要借助于兩個庫:asyncio和gevent。由于asyncio已經成為python的標準庫了無需pip安裝即可使用,這意味著asyncio作為Python原生的協程實現方式會更加流行。本文僅會介紹asyncio模塊。如果大家對gevent也有需求,請留言,我會單獨寫篇文章介紹這個庫的使用。

asyncio 是從Python3.4引入的標準庫,直接內置了對協程異步IO的支持。asyncio 的編程模型本質是一個消息循環,我們一般先定義一個協程函數(或任務), 從 asyncio 模塊中獲取事件循環loop,然后把需要執行的協程任務(或任務列表)扔到 loop中執行,就實現了異步IO。

定義協程函數及執行方法的演變

在最早的Python 3.4中,協程函數是通過@asyncio.coroutine 和 yeild from 實現的, 如下所示。

 import asyncio
 
 @asyncio.coroutine
 def func1(i):
     print("協程函數{}馬上開始執行。".format(i))
     yield from asyncio.sleep(2)
     print("協程函數{}執行完畢!".format(i))
 
 if __name__ == '__main__':
     # 獲取事件循環
     loop = asyncio.get_event_loop()
 
     # 執行協程任務
     loop.run_until_complete(func1(1))
 
     # 關閉事件循環
     loop.close()

這里我們定義了一個func1的協程函數,我們可以使用asyncio.iscoroutinefunction來驗證。定義好協程函數后,我們首先獲取事件循環loop,使用它的run_until_complete方法執行協程任務,然后關閉loop。

 print(asyncio.iscoroutinefunction(func1(1))) # True

Python 3.5以后引入了async/await 語法定義協程函數,代碼如下所示。每個協程函數都以async聲明,以區別于普通函數,對于耗時的代碼或函數我們使用await聲明,表示碰到等待時掛起,以切換到其它任務。

 import asyncio
 
 # 這是一個協程函數
 async def func1(i):
     print("協程函數{}馬上開始執行。".format(i))
     await asyncio.sleep(2)
     print("協程函數{}執行完畢!".format(i))
 
 if __name__ == '__main__':
     # 獲取事件循環
     loop = asyncio.get_event_loop()
 
     # 執行協程任務
     loop.run_until_complete(func1(1))
 
     # 關閉事件循環
     loop.close()

Python 3.7之前執行協程任務都是分三步進行的,代碼有點冗余。Python 3.7提供了一個更簡便的asyncio.run方法,上面代碼可以簡化為:

 import asyncio
 
 async def func1(i):
     print(f"協程函數{i}馬上開始執行。")
     await asyncio.sleep(2)
     print(f"協程函數{i}執行完畢!")
 
 if __name__ == '__main__':
     asyncio.run(func1(1))

注:Python自3.6版本起可以使用f-string來對字符串進行格式化了,相當于format函數的簡化版。

創建協程任務的演變

前面的演示案例中,我們只執行了單個協程任務(函數)。實際應用中,我們先由協程函數創建協程任務,然后把它們加入協程任務列表,最后一起交由事件循環執行。

根據協程函數創建協程任務有多種方法,其中最新的是Python 3.7版本提供的asyncio.create_task方法,如下所示:

 # 方法1:使用ensure_future方法。future代表一個對象,未執行的任務。
 task1 = asyncio.ensure_future(func1(1))
 task2 = asyncio.ensure_future(func1(2))
 
 # 方法2:使用loop.create_task方法
 task1 = loop.create_task(func1(1))
 task2 = loop.create_task(func1(2))
 
 # 方法3:使用Python 3.7提供的asyncio.create_task方法
 task1 = asyncio.create_task(func1(1))
 task2 = asyncio.create_task(func1(2))

創建多個協程任務列表后,我們還要使用asyncio.wait方法收集協程任務,并交由事件循環處理執行。

 import asyncio
 
 async def func1(i):
     print(f"協程函數{i}馬上開始執行。")
     await asyncio.sleep(2)
     print(f"協程函數{i}執行完畢!")
 
 
 async def main():
     tasks = []
     # 創建包含4個協程任務的列表
     for i in range(1, 5):
         tasks.append(asyncio.create_task(func1(i)))
         
     await asyncio.wait(tasks)
 
 if __name__ == '__main__':
     asyncio.run(main())

執行效果如下所示,你會發現4個協程任務并不是按順序執行的。

對于收集多個協程任務,Python還提供了新的asyncio.gather方法,它的作用asyncio.wait方法類似,但更強大。如果列表中傳入的不是create_task方法創建的協程任務,它會自動將函數封裝成協程任務,如下所示:

 import asyncio
 
 async def func1(i):
     print(f"協程函數{i}馬上開始執行。")
     await asyncio.sleep(2)
     print(f"協程函數{i}執行完畢!")
 
 async def main():
     tasks = []
     for i in range(1, 5):
         # 這里未由協程函數創建協程任務
         tasks.append(func1(i))
         
     # 注意這里*號。gather自動將函數列表封裝成了協程任務。
     await asyncio.gather(*tasks)
 
 if __name__ == '__main__':
     asyncio.run(main())

獲取協程任務執行結果

是的,gather方法有將函數封裝成協程任務的能力,但這還并不是兩者最主要的區別作用。兩者更大的區別在協程任務執行完畢后對于返回結果的處理上。通常獲取任務執行結果通常對于一個程序至關重要,因此我們有必要花更多時間詳細了解這兩個方法的使用。

asyncio.wait 會返回兩個值:done 和 pending,done 為已完成的協程任務列表,pending 為超時未完成的協程任務類別,需通過task.result()方法可以獲取每個協程任務返回的結果;而asyncio.gather 返回的是所有已完成協程任務的 result,不需要再進行調用或其他操作,就可以得到全部結果。

我們來看兩個示例。現在修改我們的協程函數,通過return給它增加一個返回值。

通過asyncio.wait獲取協程任務執行結果

 import asyncio
 
 async def func1(i):
     print(f"協程函數{i}馬上開始執行。")
     await asyncio.sleep(2)
     return i
 
 async def main():
     tasks = []
     for i in range(1, 5):
         tasks.append(asyncio.create_task(func1(i)))
         
     # 獲取任務執行結果。
     done, pending = await asyncio.wait(tasks)
     for task in done:
         print(f"執行結果: {task.result()}")
 
 if __name__ == '__main__':
     asyncio.run(main())

執行結果如下所示。你可以看到協程任務執行結果并不是按任務添加的順序返回的。

通過asyncio.gather獲取協程任務執行結果

繼續修改我們的代碼:

 #-*- coding:utf-8 -*-
 import asyncio
 
 async def func1(i):
     print(f"協程函數{i}馬上開始執行。")
     await asyncio.sleep(2)
     return i
 
 async def main():
     tasks = []
     for i in range(1, 5):
         tasks.append(func1(i))
 
     results = await asyncio.gather(*tasks)
     for result in results:
         print(f"執行結果: {result}")
 
 if __name__ == '__main__':
     asyncio.run(main())

執行結果如下所示。協程任務執行結果與任務添加順序完全一致。

現在你知道gather和wait方法的真正區別了嗎?

  • gather具有把普通協程函數包裝成協程任務的能力,wait沒有。wait只能接收包裝后的協程任務列表做參數。
  • 兩者返回值不一樣,wait返回的是已完成和未完成任務的列表,而gather直接返回協程任務執行結果。
  • gather返回的任務執行結果是有序的,wait方法獲取的結果是無序的。

asyncio高級使用方法

給任務添加回調函數

我們還可以給每個協程任務通過add_done_callback的方法給單個協程任務添加回調函數,如下所示:

 #-*- coding:utf-8 -*-
 import asyncio
 
 async def func1(i):
     print(f"協程函數{i}馬上開始執行。")
     await asyncio.sleep(2)
     return i
 
 # 回調函數
 def callback(future):
     print(f"執行結果:{future.result()}")
 
 async def main():
     tasks = []
     for i in range(1, 5):
         task = asyncio.create_task(func1(i))
         
         # 注意這里,增加回調函數
         task.add_done_callback(callback)
         tasks.append(task)
 
     await asyncio.wait(tasks)
 
 if __name__ == '__main__':
     asyncio.run(main())

設置任務超時

很多協程任務都是很耗時的,當你使用wait方法收集協程任務時,可通過timeout選項設置任務切換前單個任務最大等待時間長度,如下所示:

  # 獲取任務執行結果,如下所示:
  done,pending = await asyncio.wait(tasks, timeout=10)

自省

  • asyncio.current_task: 返回當前運行的Task實例,如果沒有正在運行的任務則返回 None。如果 loop 為 None 則會使用 get_running_loop()獲取當前事件循環。
  • asyncio.all_tasks: 返回事件循環所運行的未完成的Task對象的集合。

以上就是Python協程asyncio模塊的演變及高級用法的詳細內容,更多關于Python協程asyncio模塊的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • python copy模塊中的函數實例用法
  • Python多線程 Queue 模塊常見用法
  • Python中os模塊的實例用法
  • python常見模塊與用法
  • Python寫腳本常用模塊OS基礎用法詳解
  • python 中os模塊os.path.exists()的用法說明
  • python re模塊常見用法例舉
  • 詳解Python中openpyxl模塊基本用法
  • Python常用的模塊和簡單用法

標簽:黑龍江 阿里 銅川 呂梁 通遼 常德 潛江 株洲

巨人網絡通訊聲明:本文標題《Python協程asyncio模塊的演變及高級用法》,本文關鍵詞  Python,協程,asyncio,模塊,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python協程asyncio模塊的演變及高級用法》相關的同類信息!
  • 本頁收集關于Python協程asyncio模塊的演變及高級用法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩综合小视频| 欧美视频你懂的| 亚洲欧美日韩国产综合在线| 国产人妖乱国产精品人妖| 国产一区三区三区| 成人黄页毛片网站| 亚洲欧洲色图综合| 日本成人在线看| 一区二区不卡在线播放 | 亚洲色图.com| 婷婷开心激情综合| 亚洲视频小说图片| 精品一区二区三区影院在线午夜| 国产99久久久国产精品潘金| 日韩毛片视频在线看| www激情久久| 国产.欧美.日韩| 欧美丝袜丝交足nylons| 欧美猛男超大videosgay| 日韩av中文字幕一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 午夜精品影院在线观看| 精品国产免费视频| 一区二区三区在线免费观看 | 91麻豆免费观看| 日韩欧美国产一区二区在线播放| 欧美美女一区二区三区| 国产精品2024| 日韩视频一区在线观看| 最新日韩在线视频| 99久久er热在这里只有精品15 | 亚洲精品一区二区在线观看| 在线不卡中文字幕播放| 亚洲欧美日韩在线不卡| 蜜桃av一区二区三区| 在线观看网站黄不卡| 91黄色小视频| 美女精品一区二区| 欧美这里有精品| 一区在线中文字幕| 视频一区在线视频| 亚洲成人黄色影院| 三级亚洲高清视频| 在线免费观看日本一区| 欧美性猛交xxxx黑人交| 久久精品国产99国产精品| 91丨九色丨蝌蚪富婆spa| 久久久不卡影院| 欧美图区在线视频| 亚洲h精品动漫在线观看| 欧美伊人精品成人久久综合97| 成人精品鲁一区一区二区| 欧美国产国产综合| 日韩黄色小视频| 亚洲第一福利一区| 91精品国产入口| 欧美日韩视频专区在线播放| 三级在线观看一区二区| 久久免费的精品国产v∧| 日韩精品在线一区二区| 国产最新精品精品你懂的| 在线播放欧美女士性生活| 91麻豆国产福利精品| 亚洲一区二区三区四区五区黄| 日韩激情中文字幕| 国产精品污污网站在线观看| 91麻豆产精品久久久久久| 成人国产精品免费| 亚洲国产精品久久艾草纯爱| 欧美午夜在线观看| 欧美日韩免费视频| 国产一区二区在线观看视频| 国产精品国产精品国产专区不蜜| 中文字幕在线不卡视频| 欧美视频你懂的| 国产精品视频线看| 1区2区3区国产精品| 欧美日韩久久久一区| 欧美精品久久久久久久久老牛影院| 国产精品一区二区在线播放| 一区二区三区精密机械公司| 香蕉影视欧美成人| 中文字幕免费不卡| 色婷婷综合在线| 国产一区在线视频| 亚洲激情欧美激情| 精品99久久久久久| 国产在线不卡一区| 国产精品网站在线播放| 色综合色综合色综合色综合色综合| 在线观看免费亚洲| 免费av网站大全久久| 欧美综合色免费| 韩国av一区二区| 亚洲国产欧美一区二区三区丁香婷| 欧美日韩亚洲高清一区二区| 国产一区二区三区久久久| 91国偷自产一区二区开放时间 | 国产乱子伦一区二区三区国色天香| 蜜臀久久99精品久久久画质超高清| 国产精品丝袜91| 亚洲第一久久影院| 久久亚洲综合av| 蜜桃视频一区二区| 黄网站免费久久| 热久久免费视频| 色吧成人激情小说| 激情五月婷婷综合| 不卡视频在线看| 成人一区二区三区视频在线观看| 国产精品免费人成网站| 视频一区欧美精品| 亚洲欧美日韩国产一区二区三区| 亚洲天堂成人在线观看| 久久精品一区二区三区四区| 亚洲日本中文字幕区| 国产女主播一区| 色视频成人在线观看免| 99久久er热在这里只有精品15| 亚洲欧美色一区| 国产嫩草影院久久久久| 亚洲成人高清在线| 国产乱码一区二区三区| 国产乱子轮精品视频| 3d动漫精品啪啪一区二区竹菊| 在线亚洲一区二区| 国产一区二区0| 88在线观看91蜜桃国自产| 欧美日韩亚洲高清一区二区| 国产乱码一区二区三区| 色久综合一二码| 精品视频色一区| 国产精品国产三级国产普通话三级 | 亚洲男同性恋视频| 亚洲精选视频免费看| 成人免费毛片app| 色悠悠亚洲一区二区| 国产一区二区三区综合| 欧美精品一区在线观看| 亚洲国产精品传媒在线观看| 国内精品视频一区二区三区八戒 | 婷婷久久综合九色综合伊人色| 欧美三级一区二区| 91精品国产综合久久精品图片| 欧美美女bb生活片| 免费一级片91| 国产成人在线电影| 亚洲国产成人私人影院tom | 欧美一区二区免费观在线| 精品国产制服丝袜高跟| 久久精品国产免费| 洋洋成人永久网站入口| 日本v片在线高清不卡在线观看| 91麻豆精品91久久久久同性| 久久久久久一级片| 国产99久久久国产精品潘金 | 久久天天做天天爱综合色| 欧美一区二区三区视频免费| 欧美日韩情趣电影| 欧美一区二区三区精品| 日韩一区二区在线观看| 精品一区二区三区在线视频| 99精品桃花视频在线观看| 亚洲精品免费播放| 国产在线精品不卡| bt欧美亚洲午夜电影天堂| 国产精品网站一区| 日韩久久久久久| 成人福利视频网站| 亚洲午夜久久久久久久久电影网| 美女网站视频久久| 欧美理论在线播放| 中文字幕国产一区二区| 精品日韩在线一区| 色哟哟国产精品免费观看| 久久精品一区二区三区不卡| 国产精品911| 精品久久久三级丝袜| 日韩免费电影网站| 国产河南妇女毛片精品久久久| 欧美日韩日日摸| 国产成人在线视频播放| 欧美一级欧美三级在线观看 | 91精品国产综合久久久久久久 | 欧美电影精品一区二区| 亚洲欧美日韩综合aⅴ视频| 日韩欧美国产系列| 日韩二区在线观看| 丰满白嫩尤物一区二区| 欧美日韩免费观看一区二区三区| 色综合天天综合狠狠| 精品三级av在线| 日本美女一区二区三区| 国产欧美日韩麻豆91| 国产福利不卡视频| 91精品国产一区二区| 日本vs亚洲vs韩国一区三区| 在线播放日韩导航| 欧美美女黄视频| 亚洲国产婷婷综合在线精品|