Python使用grequests(gevent+requests)并发发送请求过程解析

 更新时间:2019年09月25日 14:50:03   作者:韩志超  
这篇文章主要介绍了Python使用grequests并发发送请求过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

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实现类的创建与使用方法示例

    这篇文章主要介绍了Python实现类的创建与使用方法,结合简单计算器功能实例分析了Python类的定义与使用方法,需要的朋友可以参考下
    2017-07-07
  • 解读opencv->tensorrt的数据排列方式

    解读opencv->tensorrt的数据排列方式

    这篇文章主要介绍了解读opencv->tensorrt的数据排列方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python依赖管理及打包工具Poetry使用规范

    Python依赖管理及打包工具Poetry使用规范

    这篇文章主要为大家介绍了Python依赖管理及打包工具Poetry的依赖规范,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-09-09
  • python matplotlib中文显示参数设置解析

    python matplotlib中文显示参数设置解析

    这篇文章主要介绍了python matplotlib中文显示参数设置解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Python找出列表中出现次数最多的元素三种方式

    Python找出列表中出现次数最多的元素三种方式

    本文通过三种方式给大家介绍Python找出列表中出现次数最多的元素,每种方式通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下
    2020-02-02
  • python 队列详解及实例代码

    python 队列详解及实例代码

    这篇文章主要介绍了python 队列详解的相关资料,并附简单实例代码,帮助大家学习了解数据结构的队列,需要的朋友可以参考下
    2016-10-10
  • python OpenCV学习笔记直方图反向投影的实现

    python OpenCV学习笔记直方图反向投影的实现

    这篇文章主要介绍了python OpenCV学习笔记直方图反向投影的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Python实现检测照片中的人脸数

    Python实现检测照片中的人脸数

    这篇文章主要为大家详细介绍了如何利用Python语言实现检测照片中共有多少张人脸,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-08-08
  • 跟老齐学Python之永远强大的函数

    跟老齐学Python之永远强大的函数

    Python程序中的语句都会组织成函数的形式。通俗地说,函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字,这样,我们就可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要在所有地方都重复编写这些语句。
    2014-09-09
  • Python + OpenCV 实现LBP特征提取的示例代码

    Python + OpenCV 实现LBP特征提取的示例代码

    这篇文章主要介绍了Python + OpenCV 实现LBP特征提取的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论