1. 程式人生 > 遊戲攻略 >《原神攻略》鹹魚大劍屬性與獲得方法一覽 銜珠海皇怎麼獲得?

《原神攻略》鹹魚大劍屬性與獲得方法一覽 銜珠海皇怎麼獲得?

 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。如果 loopNone 則會使用 get_running_loop()獲取當前事件迴圈。

  • asyncio.all_tasks: 返回事件迴圈所執行的未完成的Task物件的集合。