装饰器及原理可参考我的这篇文章
这个装饰器可以随便设置时间很方便,每个函数都有独立的标记时间
#!/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
呱呱呱
#-------------------------------------------------------
原文:https://www.cnblogs.com/shiqi17/p/9436591.html