首页 > 其他 > 详细

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

时间:2018-08-07 14:55:28      阅读:274      评论:0      收藏:0      [点我收藏+]
一、通过函数的闭包/命名空间原理,装饰器来实现这个功能

装饰器及原理可参考我的这篇文章
这个装饰器可以随便设置时间很方便,每个函数都有独立的标记时间

#!/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('\033[32;1mFunction \033[31;1m{0} \033[0m'                      .format(name)+'\033[32;1mcan be used after {0:.2f} seconds later\033[0m'                      .format(remain_time if remain_time > 0 else abs))
                res = None
            return res

        return inner
    return wrpper




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

#以下为被修饰函数func1
@deco_limit(3)     #间隔时间为3秒
def func1(*args, **kwargs):
    print(**kwargs)
    return '呱呱呱'

print('foo1的执行结果:')
print(foo1(1,2,3))
print(foo1(2,3,4))
time.sleep(3)
print(foo1(5,6,7))
time.sleep(2)
print(foo1(7,9,0))

print('\nfunc1的执行--:')
print(func1(1,2,3))
print(func1(2,3,4))
time.sleep(3)
print(func1(5,6,7))

#-----以下为运行结果------------
foo1的执行结果:
(1, 2, 3)
everything is ok
Function foo1 can be used after 5.00 seconds later
None
Function foo1 can be used after 2.00 seconds later
None
(7, 9, 0)
everything is ok

func1的执行--:

呱呱呱
Function func1 can be used after 3.00 seconds later
None

呱呱呱

#-------------------------------------------------------

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

原文:https://www.cnblogs.com/shiqi17/p/9436591.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!