Python使用grequests(gevent+requests)并发发送请求过程解析
(编辑:jimmy 日期: 2024/11/20 浏览:3 次 )
前言
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"htmlcode">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]>]以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇:给大家整理了19个pythonic的编程习惯(小结)