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

使用gather()函数进行并发任务的同步处理

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

在Python中,可以使用gather()函数对多个协程进行并发执行,并等待它们全部完成后继续执行其他操作。gather()函数返回一个Future对象,其中包含了所有协程的结果。

gather()函数的用法如下:

async def my_coroutine():
    # 协程逻辑...

async def main():
    tasks = [my_coroutine() for _ in range(5)]
    results = await asyncio.gather(*tasks)
    # 处理结果...

asyncio.run(main())

在上面的代码中,我们定义了一个my_coroutine()协程函数来表示一个异步任务。然后,在main()函数中,我们创建了一个包含5个my_coroutine()协程对象的列表tasks。接下来,我们使用gather()函数将所有协程交给事件循环来执行,并使用await关键字等待它们全部完成。然后,我们可以通过results变量来访问所有协程的结果。

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

import asyncio
import random

async def fetch_url(url):
    delay = random.randint(1, 5)
    await asyncio.sleep(delay)
    print(f'Fetching {url} took {delay} seconds')
    return f'Response from {url}'

async def main():
    urls = [
        'https://www.google.com',
        'https://www.microsoft.com',
        'https://www.apple.com',
        'https://www.amazon.com',
        'https://www.facebook.com'
    ]
    tasks = [fetch_url(url) for url in urls]
    results = await asyncio.gather(*tasks)
    print(results)

asyncio.run(main())

在这个示例中,我们定义了一个fetch_url()协程函数来模拟从不同URL获取响应的过程。协程函数内部会使用asyncio.sleep()模拟网络请求的延迟,并打印出请求的URL和延迟时间。最后,我们使用gather()函数对5个协程进行并发执行,并等待它们全部完成。在完成后,我们打印出结果。

执行上面的代码,可能会得到以下输出:

Fetching https://www.apple.com took 2 seconds
Fetching https://www.facebook.com took 4 seconds
Fetching https://www.google.com took 4 seconds
Fetching https://www.amazon.com took 4 seconds
Fetching https://www.microsoft.com took 5 seconds
['Response from https://www.google.com', 'Response from https://www.microsoft.com', 'Response from https://www.apple.com', 'Response from https://www.amazon.com', 'Response from https://www.facebook.com']

从输出中可以看出,所有的协程都以并发的方式执行,并且最终的结果是按照原始列表中的顺序返回的。

使用gather()函数可以方便地实现并发任务的同步处理,提高程序的执行效率。