aiohttp 异步http请求-6.ClientTimeout 整个会话超时

网友投稿 422 2022-09-06


aiohttp 异步http请求-6.ClientTimeout 整个会话超时

前言

ClientTimeout 是设置整个会话的超时时间,默认情况下是300秒(5分钟)超时。

ClientTimeout

默认情况下,aio秒(5 分钟)超时,这意味着整个操作应该在 5 分钟内完成。

timeout = aiowith aioas session: ...

对于如下对session会话发单个请求,超时可能会被覆盖ClientSession.get():

async with session.get(url, timeout=timeout) as resp: ...

ClientTimeout 可以支持的字段

total 整个操作的最大秒数,包括建立连接、发送请求和读取响应。connect 如果超出池连接限制,则建立新连接或等待池中的空闲连接的最大秒数。sock_connect 为新连接连接到对等点的最大秒数,不是从池中给出的。sock_read 从对等点读取新数据部分之间允许的最大秒数。

默认超时为:

aioconnect=None, sock_connect=None, sock_read=None)

实例

timeout参数是对整个aio会话的超时时间,比如我创建一个会话,里面有10个请求。

设置超时时间为3秒,那么从创建会话开始,在3秒内完成所有的请求就不会报错,当大于3秒还没完成10个请求就会抛异常

import aioasynciofrom pathlib import Pathasync def down_img(session, url): """下载图片""" name = url.split('/')[-1] # 获得图片名字 img = await session.get(url) # 触发到await就切换,等待get到数据 content = await img.read() # 读取内容 with open('./down_img/'+str(name), 'wb') as f: # 写入至文件 f.write(content) print(f'{name} 下载完成!') return str(url)async def main(URL): # 建立会话session timeout = aio conn = aio # 防止ssl报错 async with aioconnector=conn) as session: # 建立所有任务 tasks = [asyncio.create_task(down_img(session, img_url)) for img_url in URL] # 触发await,等待任务完成 done, pending = await asyncio.wait(tasks) # all_results = [done_task.result() for done_task in done] # # 获取所有结果 # print("ALL RESULT:"+str(all_results))URL = [ ' ' ' ' ' ' ' ' ' '= Path('./down_img')if not fp.exists(): fp.mkdir()loop = asyncio.get_event_loop()loop.run_until_complete(main(URL))

由于3秒内没完成所有的请求,运行结果会抛出异常:asyncio.TimeoutError

sea-1014710_960_720.jpg 下载完成!railroad-163518_960_720.jpg 下载完成!plane-513641_960_720.jpg 下载完成!iceberg-404966_960_720.jpg 下载完成!Task exception was never retrievedfuture: exception=TimeoutError()>Traceback (most recent call last):File "D:/demo/demo/new/xuexi/d1.py", line 12, in down_img content = await img.read()... raise asyncio.TimeoutError from Noneasyncio.exceptions.TimeoutError

给单个请求添加timeout

如果我们的需求是每个请求设置超时,单个请求大于3秒就超时,把timeout参数放到get请求上

timeout = aio img = await session.get(url, timeout=timeout)

完整的代码

import aioasynciofrom pathlib import Pathasync def down_img(session, url): """下载图片""" name = url.split('/')[-1] # 获得图片名字 timeout = aio img = await session.get(url, timeout=timeout) # 触发到await就切换,等待get到数据 content = await img.read() # 读取内容 with open('./down_img/'+str(name), 'wb') as f: # 写入至文件 f.write(content) print(f'{name} 下载完成!') return str(url)async def main(URL): # 建立会话session conn = aio # 防止ssl报错 async with aioas session: # 建立所有任务 tasks = [asyncio.create_task(down_img(session, img_url)) for img_url in URL] # 触发await,等待任务完成 done, pending = await asyncio.wait(tasks) # all_results = [done_task.result() for done_task in done] # # 获取所有结果 # print("ALL RESULT:"+str(all_results))URL = [ ' ' ' ' ' ' ' ' ' '= Path('./down_img')if not fp.exists(): fp.mkdir()loop = asyncio.get_event_loop()loop.run_until_complete(main(URL))

这样写其实并不会达到我们的预期,官方文档上说对于如下请求,超时可能会被覆盖ClientSession.get()

那你timeout不管放在ClientSession() 还是单个get/post请求里,其实效果都一样,都是针对整个会话超时。

捕获超时异常 asyncio.TimeoutError

触发的超时异常是 asyncio.TimeoutError,从Traceback可以看到是​​content = await img.read()​​ 这里报错

import aioasynciofrom pathlib import Pathasync def down_img(session, url): """下载图片""" name = url.split('/')[-1] # 获得图片名字 try: img = await session.get(url) # 触发到await就切换,等待get到数据 content = await img.read() # 读取内容 with open('./down_img/'+str(name), 'wb') as f: # 写入至文件 f.write(content) print(f'{name} 下载完成!') return str(url) except asyncio.TimeoutError as msg: print('timeout: '+str(url)) return str(url)async def main(URL): # 建立会话session timeout = aio conn = aio # 防止ssl报错 async with aioconnector=conn) as session: # 建立所有任务 tasks = [asyncio.create_task(down_img(session, img_url)) for img_url in URL] # 触发await,等待任务完成 done, pending = await asyncio.wait(tasks) # all_results = [done_task.result() for done_task in done] # # 获取所有结果 # print("ALL RESULT:"+str(all_results))URL = [ ' ' ' ' ' ' ' ' ' '= Path('./down_img')if not fp.exists(): fp.mkdir()loop = asyncio.get_event_loop()loop.run_until_complete(main(URL))

运行结果:

plane-513641_960_720.jpg 下载完成!maldives-3220702_960_720.jpg 下载完成!sea-1014710_960_720.jpg 下载完成!dolomites-2580866_960_720.jpg 下载完成!iceberg-404966_960_720.jpg 下载完成!mountain-477832_960_720.jpg 下载完成!timeout: https://cdn.pixabay.com/photo/2014/10/07/13/48/mountain-477832_960_720.jpg


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Springboot FeignClient调用Method has too many Body parameters解决
下一篇:Spring JDBC 框架简介
相关文章

 发表评论

暂时没有评论,来抢沙发吧~