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之做一个小游戏
Sep 28 Python
python自动化测试之从命令行运行测试用例with verbosity
Sep 28 Python
python从入门到精通(DAY 2)
Dec 20 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
Django自定义插件实现网站登录验证码功能
Apr 19 Python
Python基本socket通信控制操作示例
Jan 30 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
python实现猜拳小游戏
Apr 05 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
怎么快速自学python
Jun 22 Python
python如何使用腾讯云发送短信
Sep 17 Python
python 离散点图画法的实现
Apr 01 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的header和asp中的redirect比较
2006/10/09 PHP
PHP静态类
2006/11/25 PHP
php 模拟POST|GET操作实现代码
2010/07/20 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
JavaScript的Cookies
2008/01/16 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
javascript动态加载二
2012/08/22 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
python批量修改文件名的示例
2020/09/27 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
介绍一下Linux文件的记录形式
2012/04/18 面试题
Java如何读取CLOB字段
2013/10/10 面试题
中学生打架检讨书
2014/02/10 职场文书
吨的认识教学反思
2014/04/27 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
详解nginx进程锁的实现
2021/06/14 Servers