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实现拷贝/删除文件夹的方法详解
Aug 29 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
python 实现UTC时间加减的方法
Dec 31 Python
Django models.py应用实现过程详解
Jul 29 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
使用python实现名片管理系统
Jun 18 Python
python爬取音频下载的示例代码
Oct 19 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
实例讲解Python中sys.argv[]的用法
Jun 03 Python
OpenCV图像变换之傅里叶变换的一些应用
Jul 26 Python
Python实现信息管理系统
Jun 05 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
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
javascript 播放器 控制
2007/01/22 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
Python优先队列实现方法示例
2017/09/21 Python
python简单操作excle的方法
2018/09/12 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
python 实现的车牌识别项目
2021/01/25 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
问卷调查计划书
2014/01/10 职场文书
新年团拜会主持词
2014/04/02 职场文书
车间核算员岗位职责
2014/07/01 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
银行实习推荐信
2015/03/27 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
初一语文教学反思
2016/03/03 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server