以下是一个示例解决方法,演示了如何捕获错误并取消所有并行请求:
import asyncio
async def fetch_data(url):
# 模拟异步请求数据的函数
await asyncio.sleep(2)
# 抛出一个异常,模拟请求错误
raise ValueError("请求错误")
async def main():
urls = ["http://example.com", "http://example.net", "http://example.org"]
tasks = []
for url in urls:
task = asyncio.create_task(fetch_data(url))
tasks.append(task)
try:
# 并行执行所有请求
await asyncio.gather(*tasks)
except Exception as e:
# 捕获异常并取消所有未完成的任务
for task in tasks:
if not task.done():
task.cancel()
# 等待被取消的任务完成
await asyncio.gather(*tasks, return_exceptions=True)
# 处理异常
print(f"捕获到异常: {e}")
asyncio.run(main())
在上面的示例中,我们定义了一个fetch_data
函数来模拟异步请求数据的行为,当调用该函数时,它会等待2秒钟然后抛出一个ValueError
异常来模拟请求错误。
在main
函数中,我们创建了一个包含所有请求任务的任务列表tasks
,然后使用asyncio.gather(*tasks)
来并行执行所有请求。
在try
块中,我们使用await asyncio.gather(*tasks)
来等待所有请求完成。如果其中一个请求抛出异常,将会在except
块中捕获到该异常。
在except
块中,我们首先使用task.cancel()
取消所有未完成的任务。然后,我们再次使用await asyncio.gather(*tasks, return_exceptions=True)
来等待所有被取消的任务完成,并将return_exceptions
参数设置为True
,以便我们可以获取到被取消任务的异常。
最后,我们打印出捕获到的异常。
请注意,以上代码仅为示例,实际使用时可能需要根据具体的需求进行修改和调整。