Python使用grequests并发发送请求的示例


Posted in Python onNovember 05, 2020

前言

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使用grequests并发发送请求的示例的详细内容,更多关于Python grequests发送请求的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
Python常用内置模块之xml模块(详解)
May 23 Python
Django权限机制实现代码详解
Feb 05 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
python常用数据重复项处理方法
Nov 22 Python
Python内置加密模块用法解析
Nov 25 Python
python接口自动化之ConfigParser配置文件的使用详解
Aug 03 Python
Python学习笔记之装饰器
Aug 06 Python
Python利用命名空间解析XML文档
Aug 10 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
python用opencv 图像傅里叶变换
Jan 04 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 #Python
Python中常用的os操作汇总
Nov 05 #Python
Python Web项目Cherrypy使用方法镜像
Nov 05 #Python
Python实现异步IO的示例
Nov 05 #Python
Python requests HTTP验证登录实现流程
Nov 05 #Python
Python包资源下载路径报404解决方案
Nov 05 #Python
如何一键升级Python所有包
Nov 05 #Python
You might like
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
python基础教程之面向对象的一些概念
2014/08/29 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
Python pymongo模块用法示例
2018/03/31 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
django admin 添加自定义链接方式
2020/03/11 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
市三好学生主要事迹
2014/01/28 职场文书
幼儿教师工作感言
2014/02/14 职场文书
社区反邪教工作方案
2014/06/16 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
写给领导的感谢信
2015/01/22 职场文书
高中生军训感言
2015/08/01 职场文书
golang中的并发和并行
2021/05/08 Golang
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
Python简易开发之制作计算器
2022/04/28 Python