'''
为分析程序内哪些函数执行时间开销较大,定义一个timeout参数的函数装饰器.装饰功能:
1.统计被装饰函数单词调用运行时间.
2.时间大于参数timeout的,将此次函数调用记录到log日志中.
3.运行时可修改timeout的值.
解决方案:
为包裹函数增添一个函数,用来修改闭包中使用的自由变量.
在python3中:使用nonlocal访问嵌套作用域中的变量引用
'''
from functools
import wraps
import time
import logging
from random
import randint
def warn(timeout):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
used = time.time() - start
if used > timeout:
msg =
'"%s": %s > %s' % (func.__name__, used, timeout)
logging.warn(msg)
return res
def setTimeout(k):
nonlocal timeout
timeout = k
wrapper.setTimeout = setTimeout
return wrapper
return decorator
def warn1(timeout):
timeout = [timeout]
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
used = time.time() - start
if used > timeout[
0]:
msg =
'"%s": %s > %s' % (func.__name__, used, timeout[
0])
logging.warn(msg)
return res
def setTimeout(k):
timeout[
0] = k
wrapper.setTimeout = setTimeout
return wrapper
return decorator
@warn1(1.5)
def test():
print(
'IN test')
while randint(
0,
1):
time.sleep(
0.5)
if __name__ ==
'__main__':
for _
in range(
30):
test()
test.setTimeout(
1)
for _
in range(
30):
test()
转载请注明原文地址: https://ju.6miu.com/read-150191.html