异步编程中的asyncio.wait函数详解
一、引言
在Python的异步编程中,asyncio
模块提供了多种工具来处理并发任务。asyncio.wait
是一个强大的函数,它允许我们等待多个协程(coroutine)或任务(task)的完成,本文将详细介绍asyncio.wait
的用法、参数、返回值以及与asyncio.gather
的区别,并通过实际代码示例帮助读者更好地理解和应用这一函数。
二、asyncio.wait函数
asyncio.wait
函数用于等待多个协程或任务的完成,它可以传入一个任务列表,并返回两个集合:已完成的任务和未完成的任务,这个函数特别适用于需要同时启动多个异步操作,并在它们全部完成后进行后续处理的场景。
三、asyncio.wait函数的参数
collection_of_tasks
:这是一个包含多个协程或任务的可迭代对象,如列表、元组或集合,这些任务可以是协程对象、Task对象或其他FutureLike对象。
timeout
(可选):指定等待的最长时间(以秒为单位),如果超时,尚未完成的任务将被取消。
return_when
(可选):指定何时返回结果,有三个选项:asyncio.ALL_COMPLETED
(默认)、asyncio.FIRST_COMPLETED
和asyncio.FIRST_EXCEPTION
,具体含义如下:
asyncio.ALL_COMPLETED
:等待所有任务完成或被取消。
asyncio.FIRST_COMPLETED
:一旦有一个任务完成或被取消,立即返回。
asyncio.FIRST_EXCEPTION
:一旦有一个任务引发异常,立即返回。
四、asyncio.wait函数的返回值
asyncio.wait
返回一个包含两个集合的元组:
1、done
:已完成的任务集合。
2、pending
:未完成的任务集合(如果有的话)。
五、asyncio.wait的使用示例
以下是一个简单的示例,演示如何使用asyncio.wait
等待多个协程的完成:
import asyncio async def job(duration): print(f"Job with duration {duration} started.") await asyncio.sleep(duration) print(f"Job with duration {duration} finished.") return duration async def main(): tasks = [ asyncio.create_task(job(1)), asyncio.create_task(job(2)), asyncio.create_task(job(3)), ] done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED) print("All tasks completed or cancelled.") for task in done: try: result = await task print(f"Task resulted in {result}") except Exception as e: print(f"Task raised an exception: {e}") if pending: print("There are still pending tasks.") asyncio.run(main())
输出:
Job with duration 1 started. Job with duration 2 started. Job with duration 3 started. Job with duration 1 finished. Job with duration 2 finished. Job with duration 3 finished. All tasks completed or cancelled. Task resulted in 1 Task resulted in 2 Task resulted in 3
在这个示例中,我们创建了三个任务,每个任务休眠不同的时间,使用asyncio.wait
等待所有任务完成,然后打印每个任务的结果。
六、asyncio.wait与asyncio.gather的区别
asyncio.wait
和asyncio.gather
都可以用来等待多个协程的完成,但它们有一些关键区别:
asyncio.wait
返回已完成和未完成的任务集合,而asyncio.gather
只返回已完成的任务结果。
asyncio.wait
可以通过return_when
参数控制何时返回,而asyncio.gather
总是等待所有任务完成或引发的第一个异常。
asyncio.gather
支持优雅地处理异常,通过设置return_exceptions=True
,可以在结果列表中包含异常对象;而asyncio.wait
需要手动检查任务是否引发异常。
七、归纳
asyncio.wait
是处理多个异步任务的强大工具,适用于需要等待一组任务完成并进行后续处理的场景,通过合理使用其参数,可以实现灵活的任务管理策略,在某些情况下,asyncio.gather
可能更适合,特别是当需要获取所有任务的结果或希望更简洁地处理异常时,选择哪种方法取决于具体的应用需求和个人偏好。
以上就是关于“asyncio.wait”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/644906.html