一、通过函数的闭包/命名空间原理,装饰器来实现这个功能
装饰器及原理可参考我的这篇文章
这个装饰器可以随便设置时间很方便,每个函数都有独立的标记时间
#!/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 later 33[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---呱呱呱
#-------------------------------------------------------