关于装饰器:
作用方面,类似于过滤器和拦截器,在原始函数执行前和执行后添加一些自定义逻辑。
实现方面,就是在装饰器参数中传入原始函数,由装饰器来控制原始函数的执行。
使用方面,在原始函数头上像打java注解一样,加上 @装饰器函数名。
装饰器写法:
(1)线程模式_改:是装饰器包含额外入参的写法,三层结构;使用时要有(),@线程模式_改()
(2)线程模式:是装饰器不需要额外入参的写法,两层结构;使用时没有(),@线程模式
import threading
from concurrent import futures
from functools import wraps
# region 线程
# -- 关于初始化区,扫描到几个@就执行几次
__线程池_装饰专用 = futures.ThreadPoolExecutor(12)
def 线程模式_改(is_VIP = False, VIP_name = None): # 这里的参数,是给装饰器的参数
# region 装饰器的初始化区1
# endregion
def wrap(func):
# region 装饰器的初始化区3
# endregion
@wraps(func) # 复制原始函数信息,并保留下来
def inner(*args, **kwargs): # args和kwargs,是原始函数的参数;args是元祖,kwargs是字典
# region 执行原始函数前
# endregion
if is_VIP:
rst = threading.Thread(target=func, name=VIP_name, args=args, kwargs=kwargs)
rst.start()
else:
rst = __线程池_装饰专用.submit(func, *args, **kwargs) # 执行原始函数
# region 执行原始函数后
# endregion
return rst
# region 装饰器的初始化区4
# endregion
return inner
# region 装饰器的初始化区2
# endregion
return wrap
def 线程模式(func):
# region 装饰器的初始化区3
# endregion
@wraps(func) # 复制原始函数信息,并保留下来
def inner(*args, **kwargs): # args和kwargs,是原始函数的参数;args是元祖,kwargs是字典
# region 执行原始函数前
# endregion
rst = __线程池_装饰专用.submit(func, *args, **kwargs) # 执行原始函数
# region 执行原始函数后
# endregion
return rst
# region 装饰器的初始化区4
# endregion
return inner
# endregion
示例:
@线程模式
@打点计时
def a1(s = None):
for i in range(5):
time.sleep(1)
print_加锁(s)
for i in range(10):
a1(i)
线程装饰器、计时装饰器
import threading
from concurrent import futures
from functools import wraps
__lock_print = threading.Lock()
def print_加锁(*args, **kwargs):
with __lock_print:
print(*args, **kwargs)
# region 计时
def 打点计时(func):
@wraps(func) # 复制原始函数信息,并保留下来
def inner(*args, **kwargs): # args和kwargs,是原始函数的参数;args是元祖,kwargs是字典
# region 执行原始函数前
计时器 = 打点计时类.实例化()
计时器.打点()
# endregion
rst = func(*args, **kwargs) # 执行原始函数
# region 执行原始函数后
计时器.打点()
print_加锁(f'''{func.__name__}: {计时器.计时()}''')
# endregion
return rst
return inner
# endregion
# region 线程
__线程池_装饰专用 = futures.ThreadPoolExecutor(12)
def 线程模式_改(is_VIP = False, VIP_name = None): # 这里的参数,是给装饰器的参数
# region 装饰器的初始化区1
# endregion
def wrap(func):
# region 装饰器的初始化区3
# endregion
@wraps(func) # 复制原始函数信息,并保留下来
def inner(*args, **kwargs): # args和kwargs,是原始函数的参数;args是元祖,kwargs是字典
# region 执行原始函数前
# endregion
if is_VIP:
rst = threading.Thread(target=func, name=VIP_name, args=args, kwargs=kwargs)
rst.start()
else:
rst = __线程池_装饰专用.submit(func, *args, **kwargs) # 执行原始函数
# region 执行原始函数后
# endregion
return rst
# region 装饰器的初始化区4
# endregion
return inner
# region 装饰器的初始化区2
# endregion
return wrap
def 线程模式(func):
# region 装饰器的初始化区3
# endregion
@wraps(func) # 复制原始函数信息,并保留下来
def inner(*args, **kwargs): # args和kwargs,是原始函数的参数;args是元祖,kwargs是字典
# region 执行原始函数前
# endregion
rst = __线程池_装饰专用.submit(func, *args, **kwargs) # 执行原始函数
# region 执行原始函数后
# endregion
return rst
# region 装饰器的初始化区4
# endregion
return inner
# endregion
打点计时类:https://blog.csdn.net/u013595395/article/details/108763819