Python使用grequests(gevent+requests)并发发送请求过程解析


Posted in Python onSeptember 25, 2019

前言

requests是Python发送接口请求非常好用的一个三方库,由K神编写,简单,方便上手快。但是requests发送请求是串行的,即阻塞的。发送完一条请求才能发送另一条请求。

为了提升测试效率,一般我们需要并行发送请求。这里可以使用多线程,或者协程,gevent或者aiohttp,然而使用起来,都相对麻烦。

grequests是K神基于gevent+requests编写的一个并发发送请求的库,使用起来非常简单。

安装方法: pip install gevent grequests

项目地址:https://github.com/spyoungtech/grequests

grequests简单使用

首先构造一个请求列表,使用grequests.map()并行发送,得到一个响应列表。示例如下。

import grequests
req_list = [  # 请求列表
  grequests.get('http://httpbin.org/get?a=1&b=2'),
  grequests.post('http://httpbin.org/post', data={'a':1,'b':2}),
  grequests.put('http://httpbin.org/post', json={'a': 1, 'b': 2}),
]
res_list = grequests.map(req_list)  # 并行发送,等最后一个运行完后返回
print(res_list[0].text) # 打印第一个请求的响应文本

grequests支持get、post、put、delete等requests支持的HTTP请求方法,使用参数和requests一致,发送请求非常简单。
通过遍历res_list可以得到所有请求的返回结果。

grequests和requests性能对比

我们可以对比下requests串行和grequests并行请求100次github.com的时间,示例如下。

使用requests发送请求

import requests
import time
start = time.time()
res_list = [requests.get('https://github.com') for i in range(100)]
print(time.time()-start)

实际耗时约100s+

使用grequests发送

import grequests
import time

start = time.time()
req_list = [grequests.get('https://github.com') for i in range(100)]
res_list = grequests.map(req_list)
print(time.time()-start)

实际耗时约3.58s

异常处理

在批量发送请求时难免遇到某个请求url无法访问或超时等异常,grequests.map()方法还支持自定义异常处理函数,示例如下。

import grequests
def err_handler(request, exception):
  print("请求出错")
req_list = [
  grequests.get('http://httpbin.org/delay/1', timeout=0.001),  # 超时异常
  grequests.get('http://fakedomain/'),  # 该域名不存在
  grequests.get('http://httpbin.org/status/500')  # 正常返回500的请求
]
res_list = grequests.map(reqs, exception_handler=err_handler)
print(res_list)

运行结果:

请求出错
请求出错
[None, None, <Response [500]>]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
python实现图片文件批量重命名
Mar 23 Python
Python实现京东秒杀功能代码
May 16 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
Python  Django 母版和继承解析
Aug 09 Python
Python csv模块使用方法代码实例
Aug 29 Python
python统计字符的个数代码实例
Feb 07 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
django 连接数据库出现1045错误的解决方式
May 14 Python
Python爬虫实例——爬取美团美食数据
Jul 15 Python
在Python 中将类对象序列化为JSON
Apr 06 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 #Python
Python 图像对比度增强的几种方法(小结)
Sep 25 #Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 #Python
python super的使用方法及实例详解
Sep 25 #Python
Pycharm+Python+PyQt5使用详解
Sep 25 #Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 #Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 #Python
You might like
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
逐步提升php框架的性能
2008/01/10 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
php编程每天必学之验证码
2016/03/03 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
java解析json方法总结
2019/05/16 PHP
childNodes.length与children.length的区别
2009/05/14 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
2020/10/28 Javascript
django用户登录和注销的实现方法
2018/07/16 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
numpy创建单位矩阵和对角矩阵的实例
2019/11/29 Python
python3 实现口罩抽签的功能
2020/03/11 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
顶碗少年教学反思
2014/02/21 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
综合测评个人总结
2015/03/03 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android