请实现一个装饰器,限制该函数被调用的频率,如10秒一次

一、通过函数的闭包/命名空间原理,装饰器来实现这个功能
装饰器及原理可参考我的这篇文章 这个装饰器可以随便设置时间很方便,每个函数都有独立的标记时间
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import time

def deco_limit(s, foo= None):
    """
    这是个函数装饰器,可以控制访问频率
    :param s: 该参数为访问频率,每多少s一次
    :param foo: 可选参数,用户自定制装饰器逻辑(比如cookie或状态验证等,执行返回值为False则不执行函数)  #该参数实现了,我又删了,不好用,给你提供思路自己做
    :return:
    """
    def wrpper(func):
        """
        该函数接受被修饰函数作为参数,返回装饰器,变量func_identify为变量标识,
        存储被修饰函数的name为key,value为调用成功的时间戳。key-second存储为时间频率
        :param func: 参数为被修饰函数
        :return:
        """
        name = func.__name__
        func_identify ={name: 0,'foo': foo, 'second': s}
        def inner(*args, **kwargs):
            """
            执行函数
            :param args: 将接收的参数,打包
            :param kwargs:
            :return:
            """
            useable_time = func_identify[name] + func_identify['second']
            time_now = time.time()
            remain_time = useable_time-time_now
            # print(remain_time)
            if time_now > useable_time:
                func_identify[name] = time_now #设置调用时间
                res = func(*args,**kwargs)
            else:
                print('33[32;1mFunction 33[31;1m{0} 33[0m'
                      .format(name)+'33[32;1mcan be used after {0:.2f} seconds later33[0m'
                      .format(remain_time))
                res = None
            return res

        return inner
    return wrpper




#以下为被装饰函数foo1
@deco_limit(5)     #在这儿参数为设置调用间隔时间
def foo1(*args, **kwargs):
    """ do something with args and kwargs"""
    print('执行foo1--everything is ok')
    return 'result'

#以下为被修饰函数func1
@deco_limit(3)     #间隔时间为3秒
def func1(*args, **kwargs):
    """ do something with args and kwargs"""
    print('执行func1---呱呱呱')
    return 'result'

print('测试混合执行:')
foo1(1,2,3)
func1(1,2,3)
foo1(2,3,4)
time.sleep(3)
foo1(5,6,7)
time.sleep(2)
foo1(7,9,0)

print('
测试混合执行--:')
func1(1,2,3)
foo1(2,4,52)
func1(2,3,4)
time.sleep(3.2)
foo1(3,4,5)
func1(5,6,7)

#-----以下为运行结果------------
测试混合执行:
执行foo1--everything is ok
执行func1---呱呱呱
Function foo1 can be used after 5.00 seconds later
Function foo1 can be used after 2.00 seconds later
执行foo1--everything is ok

测试混合执行--:
执行func1---呱呱呱
Function foo1 can be used after 5.00 seconds later
Function func1 can be used after 3.00 seconds later
Function foo1 can be used after 1.80 seconds later
执行func1---呱呱呱

#-------------------------------------------------------
原文地址:https://www.cnblogs.com/shiqi17/p/9436591.html