Python并发请求下限制QPS(每秒查询率)的实现代码


Posted in Python onJune 05, 2020

  前两天有一个需求,需要访问某API服务器请求数据,该服务器限制了QPS=2(哈哈应该都知道是哪个服务器了吧_(:з」∠)_),因为QPS很小所以就使用阻塞式请求。后来开通了服务,QPS提高到了20,阻塞式请求满足不了这个QPS了,于是使用了GRequests来并发请求数据,但这里又遇到了一个问题:并发太快,服务器通过发送错误码拒绝了很多数据的响应,造成了资源的浪费。
  故在此记录以下几种 节流(Throttle) 方法:

  以下均假设有如下包和数据前提:

import grequests

urls = [
 "https://www.baidu.com",
 "https://www.google.com"
]
requests = [
 grequests.get(url)
 for url in urls
] * 1000

rate = 20 # 表示 20 请求/秒

time.sleep(1)

  这是最简单的方法,通过time.sleep(1)阻塞进程来控制每秒并发数量。用公式表达如下:Time=++time.sleep(1)Time = 请求准备时延 + 请求发送时延 + time.sleep(1)Time=请求准备时延+请求发送时延+time.sleep(1)   但是这种方法有一个较小的问题:不精确 。数据量越大,方差越大。

from time import sleep

req_groups = [
 requests[i: i+rate]
 for i in range(0, len(requests), rate)
]

ret = []
for req_group in req_groups:
 ret += grequests.map(req_group)
 sleep(1)

print(ret)

令牌桶(token bucket)方法

  这种方法较精确,可以确保误差不超过±1(当然前提是你的电脑和目标服务器都能承受的了高并发)。以下是耗时的公式表示:Time=++延Time = 请求准备时延 + 请求发送时延 + 令牌桶阻塞时延Time=请求准备时延+请求发送时延+令牌桶阻塞时延 1+延令牌桶阻塞时延 ≈ 1 - 请求准备时延 + 请求发送时延令牌桶阻塞时延≈1−请求准备时延+请求发送时延   这种方法当然也有一点缺陷,CPU看起来会很高(这是由于 while pass),尽管CPU真实使用率很低。

from time import time

class Throttle:
 def __init__(self, rate):
  self.rate = rate
  self.tokens = 0
  self.last = 0
 
 def consume(self, amount=1):
  now = time()
  
  if self.last == 0:
   self.last = now
  
  elapsed = now - self.last

  if int(elapsed * self.rate):
   self.tokens += int(elapsed * self.rate)
   self.last = now
  
  self.tokens = (
   self.rate
   if self.tokens > self.rate
   else self.tokens
  )
  
  if self.tokens >= amount:
   self.tokens -= amount
  else:
   amount = 0
  
  return amount

throttle = Throttle(rate)

req_groups = [
 requests[i: i+rate]
 for i in range(0, len(requests), rate)
]

ret = []
for req_group in req_groups:
 ret += grequests.map(req_group)
 while throttle.consume():
  pass # 阻塞

print(ret)

GRequests-Throttle

  这是一个使用令牌桶(token bucket)方法进行封装的GRequests修改版,使用方法很简单:
  首先安装grequests-throttle(清华镜像源更新较慢,推荐使用阿里镜像源)

pip install grequests-throttle
import grequests_throttle as gt

ret = gt.map(requests, rate=rate)
print(ret)

总结

  如果并发请求数量较小,可以考虑使用time.sleep(1)简单快捷;当并发请求数量较大时,使用令牌桶(token bucket)方法能最大化利用每一秒;如果不想写太多代码,可以使用GRequests-Throttle包进行请求流量控制。

到此这篇关于Python并发请求下限制QPS(每秒查询率)实现的文章就介绍到这了,更多相关Python并发请求下限制QPS(每秒查询率)实现内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python开发之快速搭建自动回复微信公众号功能
Apr 22 Python
Python 中的 else详解
Apr 23 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
Jan 12 Python
浅谈python实现Google翻译PDF,解决换行的问题
Nov 28 Python
python 实现调用子文件下的模块方法
Dec 07 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
Jan 25 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
Python绘制数码晶体管日期
Feb 19 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 #Python
python3读取autocad图形文件.py实例
Jun 05 #Python
Python实现加密接口测试方法步骤详解
Jun 05 #Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 #Python
python 引用传递和值传递详解(实参,形参)
Jun 05 #Python
Python检测端口IP字符串是否合法
Jun 05 #Python
Python如何基于Tesseract实现识别文字功能
Jun 05 #Python
You might like
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
DOM事件探秘篇
2017/02/15 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
Python深入学习之装饰器
2014/08/31 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
见习期自我鉴定
2013/11/07 职场文书
高三政治教学反思
2014/02/06 职场文书
机关道德讲堂实施方案
2014/03/15 职场文书
公务员更新知识培训实施方案
2014/03/31 职场文书
节约能源标语
2014/06/17 职场文书
运动会演讲稿300字
2014/08/25 职场文书
最美乡村教师观后感
2015/06/11 职场文书
婚庆主持词大全
2015/06/30 职场文书
2015年教师节感言
2015/08/03 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技