python3 装饰器模板 线程装饰器、计时装饰器

关于装饰器:

    作用方面,类似于过滤器和拦截器,在原始函数执行前和执行后添加一些自定义逻辑。

    实现方面,就是在装饰器参数中传入原始函数,由装饰器来控制原始函数的执行。 

    使用方面,在原始函数头上像打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
扫描二维码关注公众号,回复: 12829275 查看本文章

示例:

@线程模式
@打点计时
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

猜你喜欢

转载自blog.csdn.net/u013595395/article/details/113007906