Acerca de los decoradores:
En términos de función, similar a los filtros e interceptores, agregue algo de lógica personalizada antes y después de la ejecución de la función original.
En términos de implementación, la función original se pasa en los parámetros del decorador y el decorador controla la ejecución de la función original.
En términos de uso, agregue el nombre de la función @ decorator al encabezado de la función original como una anotación java.
Escritura del decorador:
(1) Thread Mode_Change: Es una estructura de tres capas en la que el decorador contiene parámetros de entrada adicionales; cuando se usa, debe haber (), @thread mode_ 改 ()
(2) Modo hilo: el decorador no requiere parámetros de entrada adicionales, estructura de dos capas; no hay () cuando se usa, modo @ hilo
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
Ejemplo:
@线程模式
@打点计时
def a1(s = None):
for i in range(5):
time.sleep(1)
print_加锁(s)
for i in range(10):
a1(i)
Decorador de hilos, decorador de tiempos
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
Categoría de puntos y sincronización: https://blog.csdn.net/u013595395/article/details/108763819