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

Python协程编程中的gather()函数详解

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

在Python中,协程是一种轻量级的线程,允许我们在单线程中实现并发任务的编程方式。协程通过使用yield关键字来实现暂停和恢复执行,从而在不阻塞整个程序的情况下执行其他任务。

在协程编程中,我们经常需要同时运行多个协程,并在它们都完成后收集结果。为了简化这个过程,Python提供了一个非常好用的函数——gather()

gather()函数是一个asyncio模块中的函数,用于并发地运行多个协程,并在它们全部完成时返回结果。这个函数接受一个可迭代的协程对象作为参数,并返回一个Future对象。

下面是一个使用gather()函数的示例:

import asyncio

async def coro1():
    print('Coroutine 1 start')
    await asyncio.sleep(1)
    print('Coroutine 1 end')
    return 'Result 1'

async def coro2():
    print('Coroutine 2 start')
    await asyncio.sleep(2)
    print('Coroutine 2 end')
    return 'Result 2'

async def main():
    tasks = [coro1(), coro2()]
    results = await asyncio.gather(*tasks)
    print('Results:', results)

asyncio.run(main())

在这个示例中,我们定义了两个协程函数coro1()coro2(),分别模拟两个耗时的任务。然后,我们在main()函数中创建了一个协程任务列表tasks,并将其作为参数传递给gather()函数。

gather()函数会同时运行这两个协程,并等待它们全部完成。一旦完成,gather()函数会返回一个包含所有结果的列表。我们可以通过使用*运算符将任务列表展开,将每个任务作为单独的参数传递给gather()函数。

最后,我们在main()函数中打印出结果列表。

运行这段代码,输出结果将是:

Coroutine 1 start
Coroutine 2 start
Coroutine 1 end
Coroutine 2 end
Results: ['Result 1', 'Result 2']

从输出结果可以看出,coro1()coro2()同时开始运行,然后coro1()完成后,coro2()继续执行。最后,gather()函数返回一个包含两个结果的列表。

注意,gather()函数返回的结果列表的顺序与作为参数传递的协程对象的顺序一致。在上面的示例中,result[0]对应coro1()的结果,result[1]对应coro2()的结果。

此外,gather()函数还可以处理Future对象。这意味着我们可以使用gather()函数来同时运行协程和非协程的任务,并在它们全部完成后返回结果。

总结来说,gather()函数是一个非常便利的工具,可以方便地并发地运行多个协程,并在它们全部完成时返回结果。它的用法非常简单,只需要将协程对象作为参数传递给gather()函数,并使用await关键字等待返回结果即可。