欢迎访问宙启技术站
智能推送

如何利用gather()函数实现多个协程的结果聚合

发布时间:2023-12-25 22:59:27

gather()函数是Python中asyncio模块中的一个函数,用于创建一个由多个协程组成的任务,并将这些协程的结果聚合起来。它的作用类似于Python中的concurrent.futures模块中的as_completed()函数,可以并发地执行多个任务并等待所有任务完成。

gather()函数的语法如下:

asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False)

- coros_or_futures:一个由协程对象或Future对象组成的可迭代对象,表示需要执行的协程任务。

- loop:可选参数,表示事件循环对象。

- return_exceptions:可选参数,表示是否返回未捕获异常的协程结果,如果为True,则未捕获的异常将被包装为异常对象;如果为False,则未捕获的异常将引发异常。

下面我们通过一个例子来演示如何利用gather()函数实现多个协程的结果聚合:

import asyncio

async def foo():
    await asyncio.sleep(1)
    return "foo"

async def bar():
    await asyncio.sleep(2)
    # 人为引发一个异常
    raise ValueError("bar")

async def baz():
    await asyncio.sleep(3)
    return "baz"

async def main():
    tasks = [foo(), bar(), baz()]
    results = await asyncio.gather(*tasks)
    print(results)

asyncio.run(main())

在上面的例子中,我们定义了三个协程函数foo()、bar()和baz(),分别模拟了三个耗时的任务。在bar()函数中,我们人为地引发了一个ValueError异常。

main()函数中,我们创建了一个包含这三个协程任务的任务列表tasks。然后,我们使用asyncio.gather()函数来执行这些协程任务,并通过await关键字等待所有任务完成,并将任务的结果聚合到列表results中。

最后,我们打印出results,即三个协程任务的执行结果。

运行上述代码,可以得到以下输出:

[<coroutine object foo at 0x7fbf6020a3c0>, ValueError('bar'), <coroutine object baz at 0x7fbf60206950>]

可以看到,协程函数foo()baz()的执行结果正常返回,而协程函数bar()引发的异常被包装为了一个ValueError对象。这是因为我们在gather()函数的return_exceptions参数中设置了False(默认值),所以未捕获的异常会引发异常。

通过gather()函数,我们可以方便地将多个协程任务的结果聚合起来,便于进一步处理和分析。同时,由于gather()函数的执行是并发的,因此可以大大提高程序的性能。