*码农日记*

2024/12.5

一、async与await的使用

1. 异步编程:允许程序在等待某些操作完成时,不阻塞程序的执行流程,而是继续执行其他任务

2. 用法:async用于声明一个函数是异步的,而await用于等待一个异步操作完成。

3. 错误处理: 使用 async 和 await 时,应该使用 try...catch 语句来处理可能出现的错误

4. asyncio.gather

  1. 并发执行:asyncio.gather 会并发执行传入的所有协程,而不是顺序执行。这意味着所有协程会同时开始执行。

  2. 等待所有任务完成:asyncio.gather 会等待所有传入的协程执行完成。如果任何一个协程中发生异常,asyncio.gather 会立即抛出异常,但可以通过设置 return_exceptions 参数为 True 来改变这一行为,使得异常作为结果列表中的一个元素返回,而不是抛出异常。 

  3. 返回结果:asyncio.gather 返回的结果列表中元素的顺序与传入协程的顺序相对应

async def func_1():
    await asyncio.sleep(3)  # 使用 async 异步等待
    print(1)


async def func_2():
    await asyncio.sleep(1)  # 使用 async 异步等待
    print(2)

async def main():
    try:
        await func_1()
        await func_2()
    except ValueError as e:
        print(f"Caught an exception: {e}")

 打印仍为1 2:这是因为await语句之间仍然是顺序执行的,只有通过gather才能实现并发

async def func():
    return 2

async def faulty_task():
    raise ValueError("Something went wrong")

async def main():
    try:
        results_1 = await asyncio.gather(faulty_task(),func(),return_exceptions=True)
        print(results_1) 
        results_2 = await asyncio.gather(faulty_task(),func())
        print(results_1) 
        #print(results_2)
    except ValueError as e:
        print(f"Caught an exception: {e}")

输出为:

[ValueError('Something went wrong'), 2]
Caught an exception: Something went wrong

解释:

1. results_1 = await asyncio.gather(faulty_task(),func(),return_exceptions=True),异步执行faulty_task()与func(),将faulty_task()抛出的异常也在结果列表中进行输出,因此第一次print为:[ValueError('Something went wrong'), 2]

2. results_2 = await asyncio.gather(faulty_task(),func()),异步执行faulty_task()与func(),faulty_task(立即抛出异常,被except捕获,因此直接输出Caught an exception: Something went wrong。后无第三次print

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值