python中Task封裝協程的知識點總結
說明
1、Task是Future的子類,Task是對協程的封裝,我們把多個Task放在循環調度列表中,等待調度執行。
2、Task對象可以跟蹤任務和狀態。Future(Task是Futrue的子類)為我們提供瞭異步編程中最終結果的處理(Task類還具有狀態處理功能)。
3、把協程封裝成Task,加入一個隊列等待調用。剛創建Task的時候不執行,遇到await就執行。
實例
import asyncio async def func(): print(1) await asyncio.sleep(2) print(2) return "返回值" async def main(): print("main開始") # 創建協程,將協程封裝到Task對象中並添加到事件循環的任務列表中,等待事件循環去執行(默認是就緒狀態)。 # 在調用 task_list = [ asyncio.create_task(func(), name="n1"), asyncio.create_task(func(), name="n2") ] print("main結束") # 當執行某協程遇到IO操作時,會自動化切換執行其他任務。 # 此處的await是等待所有協程執行完畢,並將所有協程的返回值保存到done # 如果設置瞭timeout值,則意味著此處最多等待的秒,完成的協程返回值寫入到done中,未完成則寫到pending中。 done, pending = await asyncio.wait(task_list, timeout=None) print(done, pending) asyncio.run(main())
知識點擴展:
Task 概念及用法
- Task,是 python 中與事件循環進行交互的一種主要方式。
創建 Task,意思就是把協程封裝成 Task 實例,並追蹤協程的 運行 / 完成狀態,用於未來獲取協程的結果。
- Task 核心作用:在事件循環中添加多個並發任務;
具體來說,是通過 asyncio.create_task() 創建 Task,讓協程對象加入時事件循環中,等待被調度執行。
註意:Python 3.7 以後的版本支持 asyncio.create_task(),在此之前的寫法為 loop.create_task(),開發過程中需要註意代碼寫法對不同版本 python 的兼容性。
- 需要指出的是,協程封裝為 Task 後不會立馬啟動,當某個代碼 await 這個 Task 的時候才會被執行。
當多個 Task 被加入一個 task_list 的時候,添加 Task 的過程中 Task 不會執行,必須要用 await asyncio.wait() 或 await asyncio.gather() 將 Task 對象加入事件循環中異步執行。
- 一般在開發中,常用的寫法是這樣的:
— 先創建 task_list 空列表;
— 然後用 asyncio.create_task() 創建 Task;
— 再把 Task 對象加入 task_list;
— 最後使用 await asyncio.wait 或 await asyncio.gather 將 Task 對象加入事件循環中異步執行。
註意:創建 Task 對象時,除瞭可以使用 asyncio.create_task() 之外,還可以用最低層級的 loop.create_task() 或 asyncio.ensure_future(),他們都可以用來創建 Task 對象,其中關於 ensure_future 相關內容本文接下來會一起講。
Task 用法代碼示例:
import asyncio import arrow def current_time(): ''' 獲取當前時間 :return: ''' cur_time = arrow.now().to('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss') return cur_time async def func(sleep_time): func_name_suffix = sleep_time # 使用 sleep_time(函數 I/O 等待時長)作為函數名後綴,以區分任務對象 print(f"[{current_time()}] 執行異步函數 {func.__name__}-{func_name_suffix}") await asyncio.sleep(sleep_time) print(f"[{current_time()}] 函數 {func.__name__}-{func_name_suffix} 執行完畢") return f"【[{current_time()}] 得到函數 {func.__name__}-{func_name_suffix} 執行結果】" async def run(): task_list = [] for i in range(5): task = asyncio.create_task(async_func(i)) task_list.append(task) done, pending = await asyncio.wait(task_list, timeout=None) for done_task in done: print((f"[{current_time()}] 得到執行結果 {done_task.result()}")) def main(): loop = asyncio.get_event_loop() loop.run_until_complete(run()) if __name__ == '__main__': main()
到此這篇關於python中Task封裝協程的知識點總結的文章就介紹到這瞭,更多相關python中Task封裝協程內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python協程asyncio異步編程筆記分享
- python協程與 asyncio 庫詳情
- Python協程asyncio模塊的演變及高級用法
- python進階之協程你瞭解嗎
- python asyncio 協程庫的使用