asyncio包里面的await与wait的区别

274 阅读1分钟

asyncio 包中,awaitwait 都用于处理异步任务,但它们的用途和语义有显著的区别:

1. await

  • 用途
    • await 是一个关键字,用于在协程中暂停执行,直到异步操作完成并返回结果。
  • 使用场景
    • 适用于调用其他异步函数。使用 await 时,调用的函数必须是一个协程。
  • 示例
    import asyncio
    
    async def fetch_data():
        await asyncio.sleep(1)  # 模拟异步操作
        return "数据"
    
    async def main():
        result = await fetch_data()
        print(result)
    
    asyncio.run(main())
    

2. asyncio.wait

  • 用途
    • asyncio.wait 是一个函数,用于等待一组协程或未来对象的完成。它返回一个包含已完成和未完成任务的集合。
  • 使用场景
    • 适用于需要同时等待多个任务的场景。可以控制等待的方式,比如选择等待所有任务完成或只等待第一个完成。
  • 示例
    import asyncio
    
    async def fetch_data(id):
        await asyncio.sleep(1)  # 模拟异步操作
        return f"数据{id}"
    
    async def main():
        tasks = [fetch_data(i) for i in range(3)]
        done, pending = await asyncio.wait(tasks)  # 等待所有任务完成
        for task in done:
            print(task.result())
    
    asyncio.run(main())
    

总结

  • await 是用于暂停当前协程,直到某个异步操作完成,而 asyncio.wait 用于等待一组协程的完成,提供更灵活的任务管理方式。
  • 使用 await 时,通常是单个任务的直接调用,而 asyncio.wait 更适合同时处理多个任务的场景。