當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Python asyncio.gather用法及代碼示例

用法:

awaitable asyncio.gather(*aws, return_exceptions=False)

aws 序列 concurrently 中運行等待對象。

如果 aws 中的任何等待是協程,它會自動安排為任務。

如果所有可等待對象都成功完成,則結果是返回值的聚合列表。結果值的順序對應於 aws 中等待的順序。

如果return_exceptionsFalse(默認),第一個引發的異常會立即傳播到等待的任務gather().其他待辦事項aws序列不會被取消並將繼續運行。

如果 return_exceptionsTrue ,則將異常視為成功結果,並在結果列表中聚合。

如果 gather()cancelled ,則所有提交的等待項(尚未完成)也是 cancelled

如果有任何任務或未來來自aws序列是cancelled, 它被視為提升CancelledError- 這gather()電話是不是在這種情況下取消。這是為了防止取消一個已提交的 Task/Future 導致其他 Tasks/Future 被取消。

在 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({number}), currently i={i}...")
        await asyncio.sleep(1)
        f *= i
    print(f"Task {name}: factorial({number}) = {f}")
    return f

async def main():
    # Schedule three calls *concurrently*:
    L = await asyncio.gather(
        factorial("A", 2),
        factorial("B", 3),
        factorial("C", 4),
    )
    print(L)

asyncio.run(main())

# Expected output:
#
#     Task A: Compute factorial(2), currently i=2...
#     Task B: Compute factorial(3), currently i=2...
#     Task C: Compute factorial(4), currently i=2...
#     Task A: factorial(2) = 2
#     Task B: Compute factorial(3), currently i=3...
#     Task C: Compute factorial(4), currently i=3...
#     Task B: factorial(3) = 6
#     Task C: Compute factorial(4), currently i=4...
#     Task C: factorial(4) = 24
#     [2, 6, 24]

注意

如果 return_exceptions 為 False,則在標記為完成後取消 gather() 不會取消任何已提交的等待項。例如,gather 可以在將異常傳播給調用者後標記為已完成,因此,在從 collect 捕獲異常(由 awaitables 之一引發)後調用 gather.cancel() 不會取消任何其他 awaitables。

在 3.7 版中更改:如果gather本身被取消,取消被傳播而不管return_exceptions.

在 3.10 版中更改:刪除了loop範圍。

自 3.10 版起已棄用:如果沒有提供位置參數或者不是所有位置參數都是Future-like 對象並且沒有正在運行的事件循環,則會發出棄用警告。

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 asyncio.gather。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。