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中 ? : 三元表达式的使用介绍
Oct 09 Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
python中requests和https使用简单示例
Jan 18 Python
python实现录音小程序
Oct 26 Python
对python中的高效迭代器函数详解
Oct 18 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
python进程的状态、创建及使用方法详解
Dec 06 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 Python
python Scrapy爬虫框架的使用
Jan 21 Python
详解Flask开发技巧之异常处理
Jun 15 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抽象工厂模式(Elgg)
2010/03/21 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
curl实现站外采集的方法和技巧
2014/01/31 PHP
php实现文件编码批量转换
2014/03/10 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
package.json文件配置详解
2017/06/15 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
Python 常用的安装Module方式汇总
2017/05/06 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
Python函数和模块的使用总结
2019/05/20 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
Python实现直播推流效果
2019/11/26 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
Python连接Impala实现步骤解析
2020/08/04 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
消防安全员岗位职责
2014/03/10 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
努力工作保证书
2015/02/28 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
为自己工作观后感
2015/06/11 职场文书
Python使用scapy模块发包收包
2021/05/07 Python