2024/12.5
一、async与await的使用
1. 异步编程:允许程序在等待某些操作完成时,不阻塞程序的执行流程,而是继续执行其他任务
2. 用法:async
用于声明一个函数是异步的,而await
用于等待一个异步操作完成。
3. 错误处理: 使用 async
和 await
时,应该使用 try...catch
语句来处理可能出现的错误
4. asyncio.gather
-
并发执行:
asyncio.gather
会并发执行传入的所有协程,而不是顺序执行。这意味着所有协程会同时开始执行。 -
等待所有任务完成:
asyncio.gather
会等待所有传入的协程执行完成。如果任何一个协程中发生异常,asyncio.gather
会立即抛出异常,但可以通过设置return_exceptions
参数为True
来改变这一行为,使得异常作为结果列表中的一个元素返回,而不是抛出异常。 -
返回结果:
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