zoukankan      html  css  js  c++  java
  • 请实现一个装饰器,限制该函数被调用的频率,如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---呱呱呱
    
    #-------------------------------------------------------
    
  • 相关阅读:
    由AbstractQueuedSynchronizer和ReentrantLock来看模版方法模式
    Java并发编程-CAS
    Java并发编程-volatile
    Java并发编程-synchronized
    学习几个协议
    邻接矩阵存储简单路径(1070)
    输出利用先序遍历创建的二叉树的层次遍历序列(0980)
    中缀表达式转换为后缀表达式(1042)
    特定字符序列的判断(1028)
    舞伴问题(1027)
  • 原文地址:https://www.cnblogs.com/shiqi17/p/9436591.html
Copyright © 2011-2022 走看看