前言,什么是函数限制频率? 控频的应用场景又是什么?
在python下控频可以理解为函数的调用频率,原因可能因为多方面. 频率一般是一定时间内,调用的次数,如果超过我们规定的次数,或者报错,或者堵塞接口。
那他的应用场景又是什么? 比如同事写了一个支持socks级别的tcp代理,因为写的很粗糙,我们这边用的时候,需要限制频率… 这个场景是因为服务端性能不靠谱引起的. 当然有些朋友说直接在服务端开发限频不就行了,但这样会造成一个问题,本来proxy就在阻塞中,你还过去请求…
还有一个场景,是爬虫的应用,有些网站会对于单个ip进行频率限制,那么直接套用这个控频方案就可以了.. 前提你是python语言的项目.
python实现分布式限频文章后期有修改,请到原文链接中查看更新. http://xiaorui.cc/?p=2391
这个频率限制项目是我利用空闲时间开发的,已经在各个系统上应用了. 有兴趣的朋友可以关注 使用这项目.
代码已经推送到github和python pypi源里.
https://github.com/rfyiamcool/ControlSpeed
https://pypi.python.org/pypi/controlspeed
正是介绍开始.
项目名,ControlSpeed
目的,这项目是用来控制函数调用的频率, 不仅支持本地的同步线程模式, 而且支持分布式模式,在2.3版本我已经加入多进程multiprocessing环境支持.
ControlSpeed(本地版)还不适合多线程池的场景, 当然你可以用ControlSpeedNetwork分布式版解决. 缺点是每次访问都会有一次网络io消耗.
version 2.3:
1. Add multiprocessing mode support
Usage:
装饰器使用方法
#xiaorui.cc from controlspeed import ControlSpeed @ControlSpeed(max_calls=10, period=1.0) def do_something(): pass
with关键词控制频率,适合更加细腻的控频.
#xiaorui.cc from controlspeed import ControlSpeed rate = ControlSpeed(max_calls=10, period=1.0) for i in range(100): with rate: do_something()
支持回调函数的控速
from controlspeed import ControlSpeed import time def limited(until): duration = int(round(until - time.time())) print 'Speed limited, sleeping for %d seconds' % duration rate = ControlSpeed(max_calls=2, period=3, callback=limited) for i in range(3): with rate: print i
在2.1加入了分布式限频, 借助于redis实现.
import redis redis_conn = redis.StrictRedis() key = 'xiaorui.cc' @ControlSpeedNetwork(redis_conn, key, max_calls=10, period=3.0) def do_something(args): print args time.sleep(0.1) for i in xrange(20): do_something(i)
对于python函数控频就说到这里了… 如果ControlSpeed有bug或者有新需求,call me !