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模块顶层运行的代码引起的一个Bug
Jul 04 Python
python安装以及IDE的配置教程
Apr 29 Python
python读写二进制文件的方法
May 09 Python
python将list转为matrix的方法
Dec 12 Python
详解Python中is和==的区别
Mar 21 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
深入了解python中元类的相关知识
Aug 29 Python
在python image 中实现安装中文字体
May 16 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 Python
python基础学习之递归函数知识总结
May 26 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
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
[01:44]Ti10举办地公布
2019/08/25 DOTA
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
Python中threading模块join函数用法实例分析
2015/06/04 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
python创造虚拟环境方法总结
2019/03/04 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
2022年四月新番
2022/03/15 日漫
SQL Server中使用表变量和临时表
2022/05/20 SQL Server