侵权投诉

Python后端项目的协程是什么

Linux爱好者 2021-09-23 14:38 次阅读

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

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

什么是协程?

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

协程比多线程好在哪呢?

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

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

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

协程的适用 & 不适用场景

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

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

初探异步 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 asyncio

import httpx

import threading

import time

def sync_main(url, sign):

response = httpx.get(url).status_code

print(f‘sync_main: {threading.current_thread()}: {sign}2 + 1{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: 200

16.56578803062439

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

程序运行共耗时 16.6 秒

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

import asyncio

import httpx

import threading

import 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: 200

4.518340110778809

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

程序共耗时 4.5 秒

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

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

责任编辑:haq

原文标题:强化版的 requests,这个库真牛 x

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

深入探讨 Hilt的工作原理

所涉主题      多种 Hilt 注解协同工作并生成代码的方式。 当 Hilt 配合 Gradle....
的头像 谷歌开发者 发表于 10-19 15:11 46次 阅读
深入探讨 Hilt的工作原理

如何移植OpenHarmony 3.0 到星空派开发板上

9 月 30 日,OpenHarmony 3.0 LTS 版本发布。本文将介绍如何移植 OpenHa....
的头像 HarmonyOS技术社区 发表于 10-19 09:08 79次 阅读
如何移植OpenHarmony 3.0 到星空派开发板上

鸿蒙ListContainer粘性头部装饰器组件

  这是一个 ListContainer 的粘性头部装饰器组件,主要用于展示列表+粘性头部的滑动效果....
的头像 HarmonyOS技术社区 发表于 10-19 09:06 97次 阅读

在操作系统中怎样去使用ls -l指令呢

在操作系统中怎样去使用ls -l指令呢?结果怎样?...
发表于 10-19 08:10 0次 阅读

在C函数中的传递参数过程是怎样实现的

在C函数中的传递参数过程是怎样实现的?求解...
发表于 10-19 06:25 0次 阅读

如何去实现STM23F4的FLASH读取

STM32F4XX的闪存擦除方式分为哪几种? 如何去实现STM23F4的FLASH读取? ...
发表于 10-18 15:06 101次 阅读

怎样使用STM32CubeMx生成FMC的初始化代码呢

W9825G6KH-6的原理是怎样的? 怎样使用STM32CubeMx生成FMC的初始化代码呢? ...
发表于 10-18 09:52 101次 阅读

怎样在音频播放系统里面进行音频系数量化的设计呢

怎样在音频播放系统里面进行音频系数量化的设计呢?要注意什么问题吗?...
发表于 10-18 09:27 0次 阅读

怎样去编写STM32F407+ESP8266的开发代码

怎样去编写STM32F407+ESP8266的开发代码? STM32F407+ESP8266的硬件是怎样进行连接的? ...
发表于 10-18 09:17 0次 阅读

怎样去使用GOTO语句呢

什么是goto语句?为什么goto语句这么不受待见呢?...
发表于 10-18 08:35 0次 阅读

怎样将stm32rct6的串口例程移植到stm32f103c8t6上去呢

怎样将stm32rct6的串口例程移植到stm32f103c8t6上去呢?有哪些操作步骤?...
发表于 10-18 07:53 0次 阅读

一种基于51单片机的流水灯实验

怎样去编写基于51单片机的流水灯实验代码?
发表于 10-18 07:19 0次 阅读

怎样去开发一种基于STM32的贪吃蛇小游戏

怎样去开发一种基于STM32的贪吃蛇小游戏?
发表于 10-18 06:42 0次 阅读

瘦肉精检测仪的应用范围和产品性能

瘦肉精检测仪的产品性能。瘦肉精检测仪【恒美 HM-SSJ】广泛应用于食药监局、卫生部门、医学院校、科....
发表于 10-15 14:34 14次 阅读

呕吐毒素检测仪的特点

呕吐毒素检测仪,灵敏度高,采用更先进的荧光定量检测原理,准确度更高,与国标法高度符合,满足不同层次对....
发表于 10-15 11:38 250次 阅读

关于Python18个你不知道的高效编程技巧

初识Python语言,觉得python满足了我上学时候对编程语言的所有要求。python语言的高效编....
的头像 马哥Linux运维 发表于 10-15 11:23 208次 阅读

PCB的设计、打板和焊接

最近MicroPython在嵌入式系统领域受到大家的喜爱,攻城狮们都纷纷研究起来,就连我们Funpa....
的头像 电子森林 发表于 10-15 10:04 172次 阅读

专业手持机设计的特点

手持机是能与其他设备进行数据通讯的手持型终端机,具有数据存储和操作系统,有人机交互界面可以显示输入信....
发表于 10-14 16:17 23次 阅读

大米重金属检测仪的作用

检测大米中的重金属镉,推荐【上海飞测】大米重金属检测仪,阻击‘危险’大米,操作快速简便,结果准确定量....
发表于 10-14 14:30 127次 阅读

呕吐毒素检测仪产品特点

上海飞测呕吐毒素检测仪,采用更先进的荧光定量检测原理,准确度更高,与国标法高度符合,满足不同层次对呕....
发表于 10-14 14:29 26次 阅读

大米重金属检测仪的作用

大米重金属检测仪[微测生物],阻击‘危险’大米,检测大米中的镉,操作快速简便,结果准确定量。
发表于 10-14 14:25 99次 阅读

厂界VOC气象站技术参数是什么

厂界VOC气象站技术参数是什么?环保意义上的定义是指活泼的一类挥发性有机物,即会产生危害的那一类挥发....
发表于 10-14 14:12 30次 阅读

能快速找到代码运行最慢部分的编程神器

天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高。 今天分....
的头像 Linux爱好者 发表于 10-13 16:40 114次 阅读

动态内存分配的注意事项及本质是什么

C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 234次 阅读
动态内存分配的注意事项及本质是什么

用Python实现3D地图教程

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 170次 阅读
用Python实现3D地图教程

HarmonyOS的组件化设计方案

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,Ha....
的头像 HarmonyOS开发者 发表于 10-13 09:59 188次 阅读

基于HarmonyOS的黑白翻棋手机版本

前言 之前发过两篇黑白翻棋游戏的手表版本,这次给大家带来的小分享是黑白翻棋的手机版本,也是JS写的,....
的头像 HarmonyOS官方合作社区 发表于 10-13 09:38 144次 阅读

关于Python对交通路口的红绿灯进行颜色检测

转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 230次 阅读
关于Python对交通路口的红绿灯进行颜色检测

便携式重金属测定仪可以检测什么

便携式重金属测定仪可以检测什么【霍尔德HED-IG-SZ】据有关机构保守估计,目前中国18亿亩耕地中....
发表于 10-13 09:22 16次 阅读

spring中声明式事务实现原理猜想

  @Transactional注解简介 @Transactional 是spring中声明式事务管....
的头像 Android编程精选 发表于 10-13 09:20 190次 阅读

xv6的文件系统是如何实现的

文件系统 本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部....
的头像 Linux阅码场 发表于 10-12 18:00 135次 阅读
 xv6的文件系统是如何实现的

Linux中匿名页的访问分析

Linux 中 有后备文件支持的页称为文件页,如属于进程的代码段、数据段的页,内存回收的时候这些页面....
的头像 Linux阅码场 发表于 10-12 17:52 155次 阅读

罐区防爆气象站-化工厂气象站的特点

罐区防爆气象站-化工厂气象站FT-FB【风途】面对极端强降雨天气,提前协调气象部门,将公司相关人员及....
发表于 10-12 17:45 104次 阅读

处理器中异常和中断解决

异常是能够引起程序流偏离正常流程的事件,当异常发生时,正在执行的程序就会被挂起,处理器转而执行一块与....
的头像 单片机匠人 发表于 10-12 17:14 278次 阅读

油库化工厂一体式气象站技术参数

油库化工厂一体式气象站技术参数FT-FB【风途】化工行业是非常重要的优势产业,但其在生产过程中会造成....
发表于 10-12 16:44 92次 阅读

如何制作数据可视化大屏

经常有小伙伴问,如何制作数据可视化大屏? 今天将手把手带你爬取奥运会相关信息,并利用 可视化大屏 为....
的头像 Linux爱好者 发表于 10-12 16:31 154次 阅读
如何制作数据可视化大屏

大米镉重金属检测仪有哪些用处

大米镉重金属检测仪有哪些用处【霍尔德HED-IG-SZ】大米是南方人的主食。但是近些年来,随着南北交....
发表于 10-12 16:18 29次 阅读

RUST的真实驱动案例

我们无法确定RUST在内核的最终趋势,有多少人愿意迁移,但是至少Linus愿意试水。 Wedson ....
的头像 Linux阅码场 发表于 10-12 15:59 89次 阅读
RUST的真实驱动案例

那些有着巨大影响力的代码盘点

2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah P....
的头像 strongerHuang 发表于 10-12 15:46 185次 阅读
那些有着巨大影响力的代码盘点

那些书本上都没有提到的C语言volatile用法

许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句....
的头像 STM32嵌入式开发 发表于 10-12 14:47 1011次 阅读
那些书本上都没有提到的C语言volatile用法

国产FPGA GW1NSR的片上资源和特性

   本文介绍国产FPGA GW1NSR的片上资源和特性,从官网能获取资料的途径,完成这一步可以使读....
的头像 高云半导体 发表于 10-12 14:17 1042次 阅读
国产FPGA GW1NSR的片上资源和特性

什么是MicroPython 它能做什么有什么局限

随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 225次 阅读

PO VO DTO转换神器的思路

当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思....
的头像 Linux爱好者 发表于 10-12 11:13 200次 阅读

Apple最新发布iOS 15.0.2

Apple 于周一发布了 iOS 15.0.2,并修复了一些重要的错误,包括一些特定于 Find M....
的头像 科技见闻网 发表于 10-12 10:54 495次 阅读

10具有挑战性的Python项目创意

你知道 Python 是被称为 全能编程语言 的吗?是的,它确实是,虽然不应该在每个项目中都使用它。....
的头像 Android编程精选 发表于 10-12 10:43 261次 阅读

稻谷重金属测定仪如何选择

稻谷重金属测定仪如何选择【霍尔德HED-IG-SZ】当重金属持续在体内积聚到一定量(或者发生急性中毒....
发表于 10-12 10:28 35次 阅读

如何把Python和Excel两大数据工具进行集成

  这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理....
的头像 数据分析与开发 发表于 10-12 09:41 162次 阅读
如何把Python和Excel两大数据工具进行集成

如何在Colab中使用SQL

如今,编码测试在数据科学面试过程中几乎是标准的。 作为一名数据科学招聘经理,我发现一个20-30分钟....
的头像 智能感知与物联网技术研究所 发表于 10-12 09:39 173次 阅读
如何在Colab中使用SQL

Python开发中Pycharm的实用小技巧

  Pycharm作为Python开发最常用的IDE之一,不仅兼容性好,而且功能也相当丰富,比如调试....
的头像 马哥Linux运维 发表于 10-12 09:36 145次 阅读

命令行工具Kubectl的别样用法

  kubectl 是 K8s 官方附带的命令行工具,可以方便的操作 K8s 集群。这篇文章主要介绍....
的头像 马哥Linux运维 发表于 10-12 09:31 132次 阅读

Python的时间处理模块中处理日期与时间的全面总结

Python的时间处理模块在日常的使用中用的较多,但是使用的时候基本上都是要查资料,还是有些麻烦的,....
的头像 马哥Linux运维 发表于 10-12 09:24 193次 阅读
Python的时间处理模块中处理日期与时间的全面总结

Python中最常用的几种线程锁你会用吗

前言本文将继续围绕 threading 模块讲解,基本上是纯理论偏多。 对于日常开发者来讲很少会使用....
的头像 马哥Linux运维 发表于 10-11 16:07 161次 阅读

一本教你怎么写出让同事无法维护的代码

‍对,你没看错,本文就是教你怎么写出让同事无法维护的代码。一、程序命名 容易输入的变量名 。比如:F....
的头像 Linux爱好者 发表于 10-11 15:45 179次 阅读

优秀的 Verilog/FPGA开源项目介绍(一)

优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信 今天开始会陆续介绍一些优秀的开源项....
的头像 OpenFPGA 发表于 10-11 15:31 259次 阅读
优秀的 Verilog/FPGA开源项目介绍(一)

欧拉开源操作系统首个全场景版本发布

9月25日,华为孟晚舟回国的消息刷屏了。据央视报道,当地时间24日,孟晚舟在加拿大不列颠哥伦比亚省法....
的头像 电子发烧友网 发表于 10-11 14:45 216次 阅读