Python協程(三) Asyncio運行


一、運行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 取值為何,消息都會被傳播。



參考文章:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM