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编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
python导入时小括号大作用
Jan 10 Python
Python创建xml文件示例
Mar 22 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
在Python中获取两数相除的商和余数方法
Nov 10 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
Nov 23 Python
在python里从协程返回一个值的示例
Feb 19 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
利用python生成照片墙的示例代码
Apr 09 Python
如何利用Python 进行边缘检测
Oct 14 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
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
学习php设计模式 php实现模板方法模式
2015/12/08 PHP
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
Vue实现一个无限加载列表功能
2018/11/13 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
在Python的Django框架中编写编译函数
2015/07/20 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
社区文化建设方案
2014/05/02 职场文书
会计电算化专业求职信
2014/06/10 职场文书
家具商场的活动方案
2014/08/16 职场文书
借款协议书
2014/09/16 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
三人合伙协议书范本
2014/10/29 职场文书
公司员工离职感言
2015/08/03 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
java中如何截取字符串最后一位
2022/07/07 Java/Android