使用redis实现分布式的函数调用限频

前言,什么是函数限制频率? 控频的应用场景又是什么? 

在python下控频可以理解为函数的调用频率,原因可能因为多方面. 频率一般是一定时间内,调用的次数,如果超过我们规定的次数,或者报错,或者堵塞接口。
那他的应用场景又是什么?  比如同事写了一个支持socks级别的tcp代理,因为写的很粗糙,我们这边用的时候,需要限制频率… 这个场景是因为服务端性能不靠谱引起的. 当然有些朋友说直接在服务端开发限频不就行了,但这样会造成一个问题,本来proxy就在阻塞中,你还过去请求…
还有一个场景,是爬虫的应用,有些网站会对于单个ip进行频率限制,那么直接套用这个控频方案就可以了.. 前提你是python语言的项目.

python实现分布式限频文章后期有修改,请到原文链接中查看更新. http://xiaorui.cc/?p=2391

http://xiaorui.cc/2015/11/27/%E4%BD%BF%E7%94%A8redis%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E7%9A%84%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E9%99%90%E9%A2%91/

这个频率限制项目是我利用空闲时间开发的,已经在各个系统上应用了.  有兴趣的朋友可以关注 使用这项目.

代码已经推送到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 !


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

邮箱地址不会被公开。 必填项已用*标注