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使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Python实现识别手写数字大纲
Jan 29 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
Python3.5面向对象与继承图文实例详解
Apr 24 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
使用Python实现分别输出每个数组
Dec 06 Python
详解python 中in 的 用法
Dec 12 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
Apr 13 Python
python 错误处理 assert详解
Apr 20 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
Php注入点构造代码
2008/06/14 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
python 利用zmail库发送邮件
2020/09/11 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
艺术用品:Arteza
2018/11/25 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
初三政治教学反思
2014/01/30 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python