python 限制单位时间内函数执行次数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 限制单位时间内函数执行次数相关的知识,希望对你有一定的参考价值。

#https://gist.github.com/gregburek/1441055
#限制单位时间内函数执行次数
import time
from collections import deque


def RateLimited(minutes=1, limitNum=3):
    status = deque([0] * limitNum, maxlen=limitNum)
    def decorate(func):
        def wrap(*args, **kwargs):
            current = time.clock()
            elapsed = current - status[0]
            leftToWait = minutes * 60 - elapsed
            if leftToWait > 0 and status[0] != 0:
                time.sleep(abs(leftToWait))
            ret = func(*args, **kwargs)
            status.append(time.clock())
            return ret
        return wrap
    return decorate

def redis_limit(sec=1, limit_num=30):
    rd = redis.Redis(db=1, decode_responses=True)
    name = "redis_limit"
    rd.delete(name)

    def decorate(func):
        def wrap(*args, **kwargs):
            current = time.time()
            first_status = int(float(rd.lindex(name, -1) or 0))
            elapsed = current - first_status
            wait = sec - elapsed
            if wait > 0 and rd.llen(name) >= limit_num:
                time.sleep(abs(wait))
            ret = func(*args, **kwargs)
            rd.lpush(name, current)
            rd.ltrim(name, start=0, end=limit_num - 1)
            return ret

        return wrap

    return decorate

@RateLimited()
def dd(i):
    time.sleep(3)
    print i

for i in range(200):
    dd(i)

以上是关于python 限制单位时间内函数执行次数的主要内容,如果未能解决你的问题,请参考以下文章

网站访问限制

Python中的嵌套循环

DRF之限制单位时间访问次数

如何将python烧瓶函数的执行限制为单个实例

java定时器 限制方法调用次数

Redis限制在规定时间范围内登陆错误次数限制