0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

居然有比requests更强大Python库出现

阿铭linux 来源:努力编程小伙 作者:努力编程小伙 2021-07-27 10:43 次阅读

最近公司 Python 后端项目进行重构,整个后端逻辑基本都变更为采用“异步”协程的方式实现。看着满屏幕经过 async await(协程在 Python 中的实现)修饰的代码,我顿时感到一脸懵逼,不知所措。

虽然之前有了解过“协程”是什么东西,但并没有深入探索,于是正好借着这次机会可以好好学习一下。

什么是协程?

简单来说,协程是一种基于线程之上,但又比线程更加轻量级的存在。对于系统内核来说,协程具有不可见的特性,所以这种由 程序员自己写程序来管理 的轻量级线程又常被称作 “用户空间线程”。

协程比多线程好在哪呢?

1. 线程的控制权在操作系统手中,而 协程的控制权完全掌握在用户自己手中,因此利用协程可以减少程序运行时的上下文切换,有效提高程序运行效率。

2. 建立线程时,系统默认分配给线程的 栈 大小是 1 M,而协程更轻量,接近 1 K 。因此可以在相同的内存中开启更多的协程。

3. 由于协程的本质不是多线程而是单线程,所以不需要多线程的锁机制。因为只有一个线程,也不存在同时写变量而引起的冲突。在协程中控制共享资源不需要加锁,只需要判断状态即可。所以协程的执行效率比多线程高很多,同时也有效避免了多线程中的竞争关系。

协程的适用 & 不适用场景

适用场景:协程适用于被阻塞的,且需要大量并发的场景。

不适用场景:协程不适用于存在大量计算的场景(因为协程的本质是单线程来回切换),如果遇到这种情况,还是应该使用其他手段去解决。

初探异步 http 框架 httpx

至此我们对 “协程” 应该有了个大概的了解,但故事说到这里,相信有朋友还是满脸疑问:“协程” 对于接口测试有什么帮助呢?不要着急,答案就在下面。

相信用过 Python 做接口测试的朋友都对 requests 库不陌生。requests 中实现的 http 请求是同步请求,但其实基于 http 请求 IO 阻塞的特性,非常适合用协程来实现 “异步” http 请求从而提升测试效率。

相信早就有人注意到了这点,于是在 Github 经过了一番探索后,果不其然,最终寻找到了支持协程 “异步” 调用 http 的开源库: httpx

什么是 httpx

httpx 是一个几乎继承了所有 requests 的特性并且支持 “异步” http 请求的开源库。简单来说,可以认为 httpx 是强化版 requests。

下面大家可以跟着我一起见识一下 httpx 的强大

安装

httpx 的安装非常简单,在 Python 3.6 以上的环境执行

pip install httpx

最佳实践

俗话说得好,效率决定成败。我分别使用了 httpx 异步 和 同步 的方式对批量 http 请求进行了耗时比较,来一起看看结果吧~

首先来看看同步 http 请求的耗时表现:

import asyncioimport httpximport threadingimport time

def sync_main(url, sign): response = httpx.get(url).status_code print(f‘sync_main: {threading.current_thread()}: {sign}: {response}’)

sync_start = time.time()[sync_main(url=‘http://www.baidu.com’, sign=i) for i in range(200)]sync_end = time.time()print(sync_end - sync_start)

代码比较简单,可以看到在 sync_main 中则实现了同步 http 访问百度 200 次。

运行后输出如下(截取了部分关键输出。。。):

sync_main: 《_MainThread(MainThread, started 4471512512)》: 192: 200sync_main: 《_MainThread(MainThread, started 4471512512)》: 193: 200sync_main: 《_MainThread(MainThread, started 4471512512)》: 194: 200sync_main: 《_MainThread(MainThread, started 4471512512)》: 195: 200sync_main: 《_MainThread(MainThread, started 4471512512)》: 196: 200sync_main: 《_MainThread(MainThread, started 4471512512)》: 197: 200sync_main: 《_MainThread(MainThread, started 4471512512)》: 198: 200sync_main: 《_MainThread(MainThread, started 4471512512)》: 199: 20016.56578803062439

可以看到在上面的输出中, 主线程没有进行切换(因为本来就是单线程啊喂!)请求按照顺序执行(因为是同步请求)。

程序运行共耗时 16.6 秒

下面我们试试 “异步” http 请求:

import asyncioimport httpximport threadingimport time

client = httpx.AsyncClient()

async def async_main(url, sign): response = await client.get(url) status_code = response.status_code print(f‘async_main: {threading.current_thread()}: {sign}:{status_code}’)

loop = asyncio.get_event_loop()tasks = [async_main(url=‘http://www.baidu.com’, sign=i) for i in range(200)]async_start = time.time()loop.run_until_complete(asyncio.wait(tasks))async_end = time.time()loop.close()print(async_end - async_start)

上述代码在 async_main 中用 async await 关键字实现了“异步” http,通过 asyncio ( 异步 io 库请求百度首页 200 次并打印出了耗时。

运行代码后可以看到如下输出(截取了部分关键输出。。。)

async_main: 《_MainThread(MainThread, started 4471512512)》: 56: 200async_main: 《_MainThread(MainThread, started 4471512512)》: 99: 200async_main: 《_MainThread(MainThread, started 4471512512)》: 67: 200async_main: 《_MainThread(MainThread, started 4471512512)》: 93: 200async_main: 《_MainThread(MainThread, started 4471512512)》: 125: 200async_main: 《_MainThread(MainThread, started 4471512512)》: 193: 200async_main: 《_MainThread(MainThread, started 4471512512)》: 100: 2004.518340110778809

可以看到顺序虽然是乱的(56,99,67.。。) (这是因为程序在协程间不停切换) 但是主线程并没有切换 (协程本质还是单线程 )。

程序共耗时 4.5 秒

比起同步请求耗时的 16.6 秒 缩短了接近 73 %!

俗话说得好,一步快,步步快。 在耗时方面,“异步” http 确实比同步 http 快了很多。当然,“协程” 不仅仅能在请求效率方面赋能接口测试, 掌握 “协程”后,相信小伙伴们的技术水平也能提升一个台阶,从而设计出更优秀的测试框架。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    51

    文章

    4667

    浏览量

    83443

原文标题:比 requests 更强大 Python 库,让你的爬虫效率提高一倍

文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Python自动化测试框架及其应用

    Pytest是一个非常成熟的全功能的Python测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,功能更强大
    的头像 发表于 04-03 16:15 130次阅读
    <b class='flag-5'>Python</b>自动化测试框架及其应用

    Pyserial来进行与stm32的串口通信,用write方法给32发数据时会出现数据的错误和缺失怎么解决?

    我使用的是Pyserial来进行与stm32的串口通信,python可以很好地接收32发来的数据,但是我用write方法给32发数据时会出现数据的错误和缺失,同样的32程序我用串口调试助手能够成功
    发表于 03-12 07:32

    苹果正努力为下一代iPhone搭载更强大的AI技术

    苹果公司正致力于在下一代iPhone上实现更强大的本地人工智能技术。近日,苹果收购了一家专注于AI视频压缩技术的初创公司WaveOne,此举进一步证明了苹果在AI领域的投入和决心。
    的头像 发表于 01-25 16:46 396次阅读

    震惊!居然有人给 Raspberry Pi 5 做 X 射线!

    了 Raspberry Pi 5 最新、最强大的计算机内部的秘密。 震惊!居然有人给 Raspberry Pi 5 做 X 射线! Jeff 的视频深入地介绍了 Pi 5 的内部构造,从 RAM 和 PCIe 接口
    的头像 发表于 01-10 16:42 222次阅读
    震惊!<b class='flag-5'>居然有</b>人给 Raspberry Pi 5 做 X 射线!

    拆机一个POS机器, 欢迎围观一下

    有个POS机器没什么用了, 据说这个太专业高端了, 拆开看看 虽然是个迷你pos, 磁条,ic卡, nfc 一个功能都没少, 蓝牙连手机。外壳就不放了,放个主板。比较神奇的后面居然有一块没器件的板子, 不清出干什么用。
    发表于 12-11 14:37

    python运行程序出现红色空白

    当你运行Python程序时,如果出现红色空白,这通常意味着有一个错误发生了。这个错误可能是由多种原因造成的,本文将详细介绍可能的原因和解决方法,帮助你解决这个问题。 语法错误:Python是一种
    的头像 发表于 11-28 15:30 673次阅读

    Camelot:Python强大的PDF表格提取器

    如果你有从PDF中批量提取表格的需求,那么这篇文章就是你的福音。 Python 第三方模块 Camelot 能够精准识别PDF中的表格信息,并提取为pandas数据结构,而且还能导出为多种格式
    的头像 发表于 10-21 10:57 714次阅读
    Camelot:<b class='flag-5'>Python</b>超<b class='flag-5'>强大</b>的PDF表格提取器

    Python编程实用指南

    Python 学习编程的读者,尤其适合缺乏编程基础的初学者。通过阅读本书,读者将能利用最强大的编程语言和工具,并且将体会到 Python 编程的快乐
    发表于 09-27 06:21

    通用数据库管理和开发工具DBeaver的安装方法

    大家都知道,绝大多数人所使用的的数据库连接工具是Navicat,那么有没有比它更好用,更强大的连接工具呢?最近偶然看到这款工具说比Navicat更好用,更强大,于是我自己也安装玩了玩,确实不错。至于哪款工具更实用
    发表于 09-15 09:51 467次阅读
    通用数据库管理和开发工具DBeaver的安装方法

    认识requests(3)#Python数据分析

    编程python
    未来加油dz
    发布于 :2023年09月02日 19:37:15

    认识requests(2)#Python数据分析

    编程python
    未来加油dz
    发布于 :2023年09月02日 19:36:12

    认识requests(1)#Python数据分析

    编程python
    未来加油dz
    发布于 :2023年09月02日 19:34:45

    使用Python来收集、处理和可视化人口数据

    数据分析和可视化: pandas:一个提供高性能、易用的数据结构和数据分析工具的库。 requests:一个简洁、优雅的HTTP库,用于发送网络请求和获取数据。 matplotlib:一个强大的绘图库,支持多种图形和样式。 seaborn:一个基于matplotlib的统
    的头像 发表于 06-21 17:08 943次阅读
    使用<b class='flag-5'>Python</b>来收集、处理和可视化人口数据

    更强大的5G,需要更小的连接器!

    。这一渗透速度远超之前的3G和4G。 之所以受到如此追捧,是因为5G在定义之初,就被赋予了更强大的能力——它不仅能够提供更大的带宽,支持VR、超高清视频等eMBB(增强移动宽带)应用,还可以实现更低的传输时延,满足无人驾驶、工业自动化等领域uRLLC(超可靠
    的头像 发表于 05-31 15:10 441次阅读
    <b class='flag-5'>更强大</b>的5G,需要更小的连接器!

    使用Imx8mp和rk3399proD时,比较那里的CPU配置RK比imx更强大

    在使用 Imx8mp 和 rk3399proD 时,我意识到 imx 的性能优于 rk。但是如果我们比较那里的CPU配置RK比imx更强大
    发表于 05-11 06:15