乐趣区

关于程序员:Python-异步-等待任务集合11

咱们能够通过 asyncio.wait() 函数期待异步工作实现。能够期待不同的条件,例如所有工作实现、第一个工作实现以及第一个工作因异样而失败。

让咱们认真看看。

1. 什么是 asyncio.wait()

asyncio.wait() 函数可用于期待一组异步工作实现。回忆一下,asyncio 工作是包装协程的 asyncio.Task 类的一个实例。它容许独立调度和执行协程,Task 实例提供工作句柄以查问状态和获取后果。

wait() 函数容许咱们期待一组工作实现。期待调用能够配置为期待不同的条件,例如所有工作实现、第一个工作实现以及第一个工作因谬误而失败。

接下来,让咱们看看如何应用 wait() 函数。

2. 如何应用 asyncio.wait()

asyncio.wait() 函数采纳可期待对象的汇合,通常是 Task 对象。

这能够是咱们创立的列表、字典或工作对象集,例如通过在列表了解中调用 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)

当第一个工作实现并在实现集中返回时,其余工作不会被勾销并持续并发执行。

咱们能够通过将 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)

如果在满足条件之前达到超时,则不会引发异样并且不会勾销残余工作。

当初咱们晓得如何应用 asyncio.wait() 函数,让咱们看一些无效的例子。

3. 期待所有工作的示例

咱们能够摸索如何应用 asyncio.wait() 期待所有工作。在这个例子中,咱们将定义一个简略的工作协程,它生成一个随机值,休眠几分之一秒,而后用生成的值报告一条音讯。

而后,主协程将与协程一起在列表了解中创立许多工作,而后期待所有工作实现。

# 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())

运行示例首先创立 main() 协程并将其用作 asyncio 程序的入口点。

而后 main() 协程在列表了解中创立一个蕴含十个工作的列表,每个工作提供一个从 0 到 9 的惟一整数参数。

而后 main() 协程被挂起并期待所有工作实现。工作执行。每个生成一个随机值,休眠片刻,而后报告其生成的值。

所有工作实现后,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

本文由 mdnice 多平台公布

退出移动版