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

Python中的gather()函数实现多个协程的结果收集

发布时间:2023-12-25 22:57:22

在Python中,asyncio.gather()函数用于同时运行多个协程,并收集它们的结果。它可以在异步编程中方便地执行并行任务,并且可以等待所有协程完成以收集它们的结果。

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

import asyncio

async def fetch(url):
    print(f"Fetching {url}")
    await asyncio.sleep(3)  # 模拟网络请求延迟
    return f"Data from {url}"

async def main():
    urls = ["https://www.example.com", "https://www.google.com", "https://www.python.org"]
    tasks = []

    # 创建一个包含所有任务的列表
    for url in urls:
        tasks.append(fetch(url))

    # 并发执行所有任务,并等待它们完成
    results = await asyncio.gather(*tasks)

    # 处理结果
    for result in results:
        print(result)

# 运行主函数
asyncio.run(main())

在上面的例子中,我们定义了一个fetch()协程函数,它用于模拟向给定URL发送网络请求,并返回获取的数据。然后,我们定义了一个main()协程函数,它是我们的主要执行函数。

main()函数中,我们创建了一个URL列表,并将每个URL传递给fetch()函数来创建一个协程任务。这些任务被添加到一个任务列表中。然后,我们使用asyncio.gather()函数来并发执行所有任务,并等待它们完成。asyncio.gather()函数接受一系列任务作为参数,并返回一个结果列表。

最后,我们使用for循环遍历结果列表,并打印出每个任务的结果。

当我们运行上述代码时,我们会看到类似下面的输出:

Fetching https://www.example.com
Fetching https://www.google.com
Fetching https://www.python.org
Data from https://www.example.com
Data from https://www.google.com
Data from https://www.python.org

在这个例子中,我们使用asyncio.gather()函数并发地执行了3个协程任务,每个任务模拟一个网络请求。我们使用await asyncio.sleep(3)来模拟网络请求的延迟时间。当所有任务完成并返回结果时,asyncio.gather()函数返回结果列表。

需要注意的是,asyncio.gather()函数会自动捕获并处理协程中的异常。如果其中一个协程引发了异常,asyncio.gather()函数会立即取消其他未完成的协程任务,并将异常作为结果返回。

总结来说,asyncio.gather()函数提供了一种方便的方式来同时执行多个协程任务,并收集它们的结果。它可以在异步编程中实现并行任务的效果,提高代码执行效率。同时,它还可以处理协程中的异常,确保任务的可靠执行。