欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?異步等待任務集合

 更新時間:2023年03月22日 14:01:55   作者:冷凍工廠  
這篇文章主要為大家介紹了Python?異步等待任務集合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

我們可以通過 asyncio.wait() 函數等待異步任務完成??梢缘却煌臈l件,例如所有任務完成、第一個任務完成以及第一個任務因異常而失敗。

讓我們仔細看看。

1. 什么是 asyncio.wait()

asyncio.wait() 函數可用于等待一組異步任務完成?;叵胍幌?,asyncio 任務是包裝協程的 asyncio.Task 類的一個實例。它允許獨立調度和執(zhí)行協程,Task 實例提供任務句柄以查詢狀態(tài)和獲取結果。

wait() 函數允許我們等待一組任務完成。等待調用可以配置為等待不同的條件,例如所有任務完成、第一個任務完成以及第一個任務因錯誤而失敗。

接下來,讓我們看看如何使用 wait() 函數。

2. 如何使用 asyncio.wait()

asyncio.wait() 函數采用可等待對象的集合,通常是 Task 對象。

這可以是我們創(chuàng)建的列表、字典或任務對象集,例如通過在列表理解中調用 asyncio.create_task() 函數。

...
# create many tasks
tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]

asyncio.wait() 在滿足任務集合的某些條件之前不會返回。默認情況下,條件是所有任務都已完成。

wait() 函數返回兩個集合的元組。第一個集合包含所有滿足條件的任務對象,第二個集合包含所有其他尚未滿足條件的任務對象。

這些集被稱為“完成”集和“待定”集。

...
# wait for all tasks to complete
done, pending = await asyncio.wait(tasks)

從技術上講,asyncio.wait() 是一個返回協程的協程函數。然后我們可以等待這個協程,它將返回集合的元組。

...
# create the wait coroutine
wait_coro = asyncio.wait(tasks)
# await the wait coroutine
tuple = await wait_coro

等待的條件可以由默認設置為 asyncio.ALL_COMPLETED 的“return_when”參數指定。

...
# wait for all tasks to complete
done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)

我們可以通過將 return_when 設置為 FIRST_COMPLETED 來等待第一個任務完成

...
# wait for the first task to be completed
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)

當第一個任務完成并在完成集中返回時,其余任務不會被取消并繼續(xù)并發(fā)執(zhí)行。

我們可以通過將 return_when 設置為 FIRST_EXCEPTION 來等待第一個任務因異常而失敗。

...
# wait for the first task to fail
done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)

在這種情況下,完成集將包含第一個因異常而失敗的任務。如果沒有任務因異常而失敗,則完成集將包含所有任務,只有在所有任務完成后 wait() 才會返回。

我們可以通過以秒為單位的“超時”參數指定我們愿意等待給定條件的時間。

如果在滿足條件之前超時到期,則返回任務元組以及當時滿足條件的任何任務子集,例如如果等待所有任務完成,則完成的任務子集。

...
# wait for all tasks to complete with a timeout
done, pending = await asyncio.wait(tasks, timeout=3)

如果在滿足條件之前達到超時,則不會引發(fā)異常并且不會取消剩余任務。

現在我們知道如何使用 asyncio.wait() 函數,讓我們看一些有效的例子。

3. 等待所有任務的示例

我們可以探索如何使用 asyncio.wait() 等待所有任務。在這個例子中,我們將定義一個簡單的任務協程,它生成一個隨機值,休眠幾分之一秒,然后用生成的值報告一條消息。

然后,主協程將與協程一起在列表理解中創(chuàng)建許多任務,然后等待所有任務完成。

# SuperFastPython.com
# example of waiting for all tasks to complete
from random import random
import asyncio
# coroutine to execute in a new task
async def task_coro(arg):
    # generate a random value between 0 and 1
    value = random()
    # block for a moment
    await asyncio.sleep(value)
    # report the value
    print(f'>task {arg} done with {value}')
# main coroutine
async def main():
    # create many tasks
    tasks = [asyncio.create_task(task_coro(i)) for i in range(10)]
    # wait for all tasks to complete
    done,pending = await asyncio.wait(tasks)
    # report results
    print('All done')
# start the asyncio program
asyncio.run(main())

運行示例首先創(chuàng)建 main() 協程并將其用作 asyncio 程序的入口點。

然后 main() 協程在列表理解中創(chuàng)建一個包含十個任務的列表,每個任務提供一個從 0 到 9 的唯一整數參數。

然后 main() 協程被掛起并等待所有任務完成。任務執(zhí)行。每個生成一個隨機值,休眠片刻,然后報告其生成的值。

所有任務完成后,main() 協程恢復并報告最終消息。這個例子強調了我們如何使用 wait() 函數來等待一組任務完成。

這可能是該函數最常見的用法。請注意,由于使用了隨機數,每次運行程序時結果都會不同。

>task 5 done with 0.0591009105682192
>task 8 done with 0.10453715687017351
>task 0 done with 0.15462838864295925
>task 6 done with 0.4103492027393125
>task 9 done with 0.45567100006991623
>task 2 done with 0.6984682905809402
>task 7 done with 0.7785363531316224
>task 3 done with 0.827386088873161
>task 4 done with 0.9481344994700972
>task 1 done with 0.9577302665040541
All done

以上就是Python 異步等待任務集合的詳細內容,更多關于Python 異步等待任務集合的資料請關注腳本之家其它相關文章!

相關文章

最新評論