# -*- coding: utf-8 -*-
# by dl
import time, logging
# 带参数的装饰器 内部能返回个装饰器
def warn(timeout):
# 真正的函数装饰器
def decorator(func):
# 定义包裹函数
def wrapper(*args, **kargs):
# 记录运行函数之前的时间点
start = time.time()
# 记录返回值 需要记录运行后的时间点
res = func(*args, **kargs)
# 运行的时间
used = time.time() - start
# 如果超时
if used > timeout:
# 创建消息 函数名 用时间 超时时间
msg = '%s : %s > %s' % (func.__name__, used, timeout)
# 日志接收消息
logging.warning(msg)
return res
# 装饰器内return wrapper
return wrapper
def setTimeout(k):
# 类似于global 用于声明嵌套函数中的全局声明 python3才有
nonlocal timeout
# 这里用来赋值给装饰器的timeout
timeout = k
# 通过调用函数 来设置timeout
wrapper.setTimeout = setTimeout
return decorator
from random import randint
# 测试大于1.5s的
@warn(1.5)
def test():
print('In test')
# 随机延迟0.5
while randint(0, 1):
time.sleep(0.5)
for _ in range(30):
test()
# 设置timeout为1
test.setTimeout(1)
for _ in range(30):
test()