《原神攻略》鹹魚大劍屬性與獲得方法一覽 銜珠海皇怎麼獲得?
阿新 • • 發佈:2021-09-02
Python 3.5以後引入了async/await
語法定義協程函式,程式碼如下所示。每個協程函式都以async
宣告,以區別於普通函式,對於耗時的程式碼或函式我們使用await
宣告,表示碰到等待時掛起,以切換到其它任務。
協程從建立到執行具體步驟
1、async定義協成函式,
2、由協成函式建立協成任務,有三種方式
方法1:使用ensure_future方法。future代表一個物件,未執行的任務。
task1 = asyncio.ensure_future(func1(1))
方法2:使用loop.create_task方法
task1 = loop.create_task(func1(1))
方法3:使用Python 3.7提供的asyncio.create_task方法
task1 = asyncio.create_task(func1(1))
3、收集協程任務列表,
用 await asyncio.wait(tasks)方法收集協程任務
asyncio.wait返回兩個值:done 和 pending,done 為已完成的協程任務列表,pending 為超時未完成的協程任務類別,
需通過task.result()方法可以獲取每個協程任務返回的結果
用asyncio.gather方法,比asyncio.wait方法類似,但更強大,列表中傳入的不是create_task方法建立的協程任務,它會自動將函式封裝成協程任務,返回值也不同
await asyncio.gather(*tasks),這裡*號。gather自動將函式列表封裝成了協程任務
asyncio.gather 返回的是所有已完成協程任務的 result,不需要再進行呼叫或其他操作,就可以得到全部結果。
區別:
gather具有把普通協程函式包裝成協程任務的能力,wait沒有。wait只能接收包裝後的協程任務列表做引數。
兩者返回值不一樣,wait返回的是已完成和未完成任務的列表,而gather直接返回協程任務執行結果。
gather返回的任務執行結果是有序的,wait方法獲取的結果是無序的。
4、收集協程任務列表或單個協程任務,最後一起交由事件迴圈執行
獲取事件迴圈
loop = asyncio.get_event_loop()
執行協程任務
loop.run_until_complete(func1(1))
關閉事件迴圈
loop.close()
asyncio.run方法,封裝了上三步: asyncio.run(func1(1))
5、可以給每個協程任務通過add_done_callback
方法給單個協程任務添加回調函式,
task.add_done_callback(callback)
asyncio.wait用法,獲取結果
#-*- 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)
#timeout選項設定任務切換前單個任務最大等待時間長度
await asyncio.wait(tasks, timeout=10)
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
def callback(future):
print(f"執行結果:{future.result()}"
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())
其他:
-
asyncio.current_task
: 返回當前執行的Task
例項,如果沒有正在執行的任務則返回None
。如果 loop 為None
則會使用get_running_loop()
獲取當前事件迴圈。
-
asyncio.all_tasks
: 返回事件迴圈所執行的未完成的Task
物件的集合。