Python装饰器与线程结合提高接口访问效率方法

回顾装饰器的基本用法
装饰器的本质是闭包,是python的一种语法糖

def outer(fun):def inner(*args,**kwargs):return fun(*args,**kwargs)return inner# 使用装饰器装饰一下两个函数@outerdef num1():print('a')@outerdef num2():print('b')if __name__ == '__main__':print(num1.__name__)print(num2.__name__)以上代码输出结果:innerinner装饰器的特性:使用自定义的装饰器会改变被装饰函数的函数名,一般装饰器器是不用考虑这一点的,但是如果多个函数被两个装饰器装饰就会报错,因为函数名一样

解决办法:引入 functools.wraps
import functoolsdef outer(fun):@functools.wraps(fun)def inner(*args,**kwargs):return fun(*args,**kwargs)return inner

以上代码输出结果:
num1
num2
实际业务中的应用 定义多线程的装饰器
def async_call(fun):def wrapper(*args, **kwargs):Thread(target=fun, args=args, kwargs=kwargs).start()return wrapper

可以在需要提升效率的接口上添加该装饰器
因为正常来说线程的执行效率要比进程快
可以用装饰器测试并统计函数运行时间
import timedef coast_time(func):def fun(*args, **kwargs):t = time.perf_counter()result = func(*args, **kwargs)print(f'func {func.__name__} coast time:{time.perf_counter() - t:.8f} s')return resultreturn fun

这个装饰器有感兴趣的朋友可以保存起来,以后测接口性能可以直接拿过来用!
from time import sleepfrom time import timeimport timefrom threading import Thread#这是统计时间的装饰器def coast_time(func):def fun(*args, **kwargs):t = time.perf_counter()result = func(*args, **kwargs)print(f'func {func.__name__} coast time:{time.perf_counter() - t:.8f} s')return resultreturn fun#这是创建线程的装饰器,感兴趣的可以保存一下,可以直接使用的def async_call(fun):def wrapper(*args, **kwargs):Thread(target=fun, args=args, kwargs=kwargs).start()return wrapper@coast_time@async_calldef hello():print('start')sleep(2)print('end')returnif __name__ == "__main__":hello()

不创建线程的运行时间是:2s多
使用线程装饰器的时间:0.0003s
可以在引入functools.wraps,防止装饰多个函数的时候,函数名被改变
【Python装饰器与线程结合提高接口访问效率方法】以上就是Python装饰器与线程结合提高接口访问效率方法的详细内容,更多关于Python提高接口访问效率的资料请关注脚本之家其它相关文章!

    推荐阅读