一、運行Asyncio程序
asyncio.run(coro, *, debug=False)
執行 coroutine coro 並返回結果。
此函數運行傳入的協程,負責管理 Asyncio 事件循環並完結異步生成器。
當有其他 asyncio 事件循環在同一線程中運行時,此函數不能被調用。
如果 debug 為 True
,事件循環將以調試模式運行。
此函數總是會創建一個新的事件循環並在結束時關閉之。它應當被用作 Asyncio 程序的主入口點,理想情況下應當只被調用一次。
示例:
async def main(): await asyncio.sleep(1) print('hello') asyncio.run(main())
二、創建任務
asyncio.create_task(coro, *, name=None)
將 coro 協程 打包為一個 Task
排入日程准備執行。返回 Task 對象。
如果name 不為 None
,它將使用 Task.set_name()
來設為任務的名稱。
該任務會在 get_running_loop()
返回的循環中執行,如果當前線程沒有在運行的循環則會引發 RuntimeError
。
此函數 在 Python 3.7 中被加入。在 Python 3.7 之前,可以改用低層級的 asyncio.ensure_future()
函數。
在 3.8 版更改: 添加了 name
形參。
三、並發運行任務
awaitable asyncio.gather(*aws, loop=None, return_exceptions=False)
並發 運行 aws 序列中的 可等待對象。
如果 aws 中的某個可等待對象為協程,它將自動作為一個任務加入日程。
如果所有可等待對象都成功完成,結果將是一個由所有返回值聚合而成的列表。結果值的順序與 aws 中可等待對象的順序一致。
如果 return_exceptions 為 False
(默認),所引發的首個異常會立即傳播給等待 gather()
的任務。aws 序列中的其他可等待對象 不會被取消 並將繼續運行。
如果 return_exceptions 為 True
,異常會和成功的結果一樣處理,並聚合至結果列表。
如果 gather()
被取消,所有被提交 (尚未完成) 的可等待對象也會 被取消。
如果 aws 序列中的任一 Task 或 Future 對象 被取消,它將被當作引發了 CancelledError
一樣處理 -- 在此情況下 gather()
調用 不會 被取消。這是為了防止一個已提交的 Task/Future 被取消導致其他 Tasks/Future 也被取消。
Deprecated since version 3.8, will be removed in version 3.10: loop 形參。
示例:
import asyncio async def factorial(name, number): f = 1 for i in range(2, number + 1): print(f"Task {name}: Compute factorial({i})...") await asyncio.sleep(1) f *= i print(f"Task {name}: factorial({number}) = {f}") async def main(): # Schedule three calls *concurrently*: await asyncio.gather( factorial("A", 2), factorial("B", 3), factorial("C", 4), ) asyncio.run(main()) # Expected output: # # Task A: Compute factorial(2)... # Task B: Compute factorial(2)... # Task C: Compute factorial(2)... # Task A: factorial(2) = 2 # Task B: Compute factorial(3)... # Task C: Compute factorial(3)... # Task B: factorial(3) = 6 # Task C: Compute factorial(4)... # Task C: factorial(4) = 24
注解 如果 return_exceptions 為 False,則在 gather() 被標記為已完成后取消它將不會取消任何已提交的可等待對象。 例如,在將一個異常傳播給調用者之后,gather 可被標記為已完成,因此,在從 gather 捕獲一個(由可等待對象所引發的)異常之后調用 gather.cancel() 將不會取消任何其他可等待對象。
在 3.7 版更改: 如果 gather 本身被取消,則無論 return_exceptions 取值為何,消息都會被傳播。