aiohttp 异步http请求-12

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


这不是默认行为,也没有在文档的早期宣传。正因为如此,大多数用户的性能都会受到影响,但可以很快开始黑客攻击。对于请求,这是一个可以理解的权衡,因为它的目标是成为“人类的 HTTP”,而在这种情况下,简单性总是比性能更重要。


但是,如果使用 aiohttp,则选择异步编程,这是一种进行相反权衡的范式:更冗长以获得更好的性能。因此库默认行为反映了这一点,鼓励您从一开始就使用性能最佳实践。



> 
> 如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,**[可以 点这自行获取…]( )**
> 
> 
> 


### 如何使用客户端会话?


默认情况下,该aiohttp.ClientSession对象将拥有一个最多具有 100 个连接的连接器,将其余连接放入队列中。这是一个相当大的数字,这意味着您必须同时连接到一百个不同的服务器(不是页面!),然后才能考虑您的任务是否需要资源调整。


事实上,您可以将会话对象想象为用户启动和关闭浏览器:每次您想要加载新选项卡时都这样做是没有意义的。


因此,您应该重用会话对象并从中发出许多请求。对于大多数脚本和中等大小的软件,这意味着您可以创建一个会话,并在程序的整个执行过程中重复使用它。您甚至可以将会话作为函数中的参数传递。例如,典型的“hello world”:



import aiohttp
import asyncio

async def main():
async with aiohttp.ClientSession() as session:
async with session.get(‘http://python.org’) as response:
html = await response.text()
print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())


可以变成这样:



import aiohttp
import asyncio

async def fetch(session, url):
async with session.get(url) as response:
return await response.text()

async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, ‘http://python.org’)
print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())


在更复杂的代码库上,您甚至可以创建一个中央注册表来保存来自代码中任何位置的会话对象,或者Client保存对它的引用的更高级别的类。


那么何时创建多个会话对象呢?当您需要更精细的资源管理时,就会出现这种情况:


您想通过通用配置对连接进行分组。


例如:


会话可以设置它们持有的所有连接共享的 cookie、标头、超时值等。


您需要多个线程并希望避免在它们之间共享可变对象。


您希望多个连接池从不同的队列中受益并分配优先级。


eg:


一个会话从不使用队列并且用于高优先级请求,另一个会话具有较小的并发限制和很长的队列,用于非重要请求。



> 
> 如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,**[可以 点这自行获取…]( )**
> 
> 
> 


### 优雅关闭


当在块ClientSession结束时 (或通过直接调用)关闭时,由于 asyncio 内部细节,底层连接保持打开状态。在实践中,底层连接将在片刻后关闭。但是,如果事件循环在底层连接关闭之前停止, 则会发出警告(启用警告时)。async withClientSession.close()ResourceWarning: unclosed transport


为了避免这种情况,必须在关闭事件循环之前添加一个小的延迟,以允许任何打开的底层连接关闭。


对于ClientSession没有 SSL 的情况,一个简单的零睡眠 ( ) 就足够了:await asyncio.sleep(0)



async def read_website():
async with aiohttp.ClientSession() as session:
async with session.get(‘http://example.org/’) as resp:
await resp.read()

loop = asyncio.get_event_loop()
loop.run_until_complete(read_website())

Zero-sleep to allow underlying connections to close

loop.run_until_complete(asyncio.sleep(0))
loop.close()


对于ClientSession使用 SSL,应用程序必须在关闭前等待一小段时间:



Wait 250 ms for the underlying SSL connections to close

loop.run_until_complete(asyncio.sleep(0.250))
loop.close()


请注意,等待的适当时间量因应用程序而异。


如果这最终会在 asyncio 内部发生变化时变得过时,以便 aiohttp 本身可以等待底层连接关闭。



> 
> 如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,**[可以 点这自行获取…]( )**
> 
> 
> 


这里推荐下我自己建的软件测试交流学习Q群:**746506216**,群里都是学测试的,如果你想学或者正在学习测试相关内容 ,欢迎你加入,大家都是测试党,不定期分享干货(只有软件测试相关的),包括我自己整理的一份2022最新的Python自动化测试进阶资料和零基础教学,欢迎想进阶学习、感兴趣的小伙伴加入!



![img](https://img-blog.csdnimg.cn/img_convert/21c75b28a40a2784c2a39548197864da.png)
![img](https://img-blog.csdnimg.cn/img_convert/67d182eeb5f90bdce548033dc472d16e.png)
![img](https://img-blog.csdnimg.cn/img_convert/61cef2ca877f8f6040b5b40b8e300044.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值