asyncio.gather vs asyncio.wait


前言

如果你正在学习Python中的异步编程,你可能已经遇到过asyncio.gather()和asyncio.wait()这两种函数。这两个函数都是用于同时运行多个协程的工具,但是它们有何区别呢?

在这篇教程中,我们将探讨asyncio.gather()和asyncio.wait()的区别,以及它们在异步编程中的用途。


一. asyncio.gather()

1.1语法解释

asyncio.gather()函数可以同时运行多个协程,并将它们的结果收集到一个列表中。这个函数的基本语法如下:

asyncio.gather(*coroutines, return_exceptions=False)

其中,*coroutines是一个可变参数,可以传递多个协程。这些协程将在异步环境中同时运行,并且asyncio.gather()函数将返回一个包含所有协程结果的列表。。

1.2 使用示例

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

import asyncio

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

async def world():
    await asyncio.sleep(2)
    return "World"

async def main():
    results = await asyncio.gather(hello(), world())
    print(results)

asyncio.run(main())

在这个示例中,我们定义了两个协程hello()和world(),它们分别返回字符串"Hello"和"World"。然后,在主协程中使用asyncio.gather()函数同时运行这两个协程,并将它们的结果存储在results列表中。最后,我们打印出这个列表。
运行这个程序,你会得到如下输出:

['Hello', 'World']

这个输出表明,我们使用asyncio.gather()函数同时运行了hello()和world()这两个协程,并且成功地收集了它们的结果。

二、asyncio.wait()

1.语法解释

asyncio.wait()函数也可以同时运行多个协程,但是它的返回值比asyncio.gather()函数更为灵活。这个函数的基本语法如下:

asyncio.wait(coros, *, loop=None, timeout=None, return_when=ALL_COMPLETED)

其中,coros是一个协程对象的集合,可以是一个列表、元组或集合。return_when参数指定了在多个协程中任何一个完成时返回,可以是FIRST_COMPLETED、FIRST_EXCEPTION或ALL_COMPLETED。

2.示例

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

import asyncio

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

async def world():
    await asyncio.sleep(2)
    return "World"

async def main():
    tasks = [hello(), world()]
    done, pending = await asyncio.wait(tasks)
    for task in done:
        print(task.result())

asyncio.run(main())

在这个示例中,我们定义了两个协程hello()和world(),它们分别返回字符串"Hello"和"World"。然后,在主协程中创建一个协程对象的集合tasks,并使用asyncio.wait()函数同时运行这些协程。

在这个示例中,我们使用了ALL_COMPLETED参数,这意味着当所有协程都完成时,asyncio.wait()函数将返回。函数的返回值包括两个集合:已完成的任务和未完成的任务。我们使用for循环遍历已完成的任务,并打印它们的结果。
运行这个程序,你会得到如下输出:

Hello
World

这个输出表明,我们使用asyncio.wait()函数同时运行了hello()和world()这两个协程,并且成功地收集了它们的结果。

总结

asyncio.gather()和asyncio.wait()函数都是用于同时运行多个协程的工具。它们的主要区别在于返回值的形式。

asyncio.gather()函数将协程的结果收集到一个列表中,并返回这个列表。这个函数适用于需要同时运行多个协程,并对它们的结果进行一些处理的场景。
asyncio.wait()函数的返回值包括两个集合:已完成的任务和未完成的任务。这个函数适用于需要同时运行多个协程,并在任何一个协程完成时进行一些处理的场景。

如果你只需要收集协程的结果,那么使用asyncio.gather()函数会更加简单明了。但是如果你需要对协程的状态进行更加细粒度的控制,或者需要对协程的完成时间进行一些特定的处理,那么使用asyncio.wait()函数会更加灵活。

无论你选择哪种函数,异步编程都需要仔细地处理协程的状态和结果,以确保程序的正确性和性能。希望这篇教程对你掌握asyncio.gather()和asyncio.wait()函数的用法有所帮助!

猜你喜欢

转载自blog.csdn.net/qq_69218005/article/details/129789977
今日推荐