思路
通过传递给装饰器一个参数,用来告诉装饰器当前函数最多开多少个线程,每次启动线程前要判断当前函数已经启动了多少了
代码部分
def async(max_thread):
def start_async(f):
def wrapper(*args, **kwargs):
while 1:
func_thread_active_count = len([i for i in threading.enumerate() if i.name == f.__name__ ]) # 获取已启动此函数线程的数量
if func_thread_active_count <= max_thread:
thr = Thread(target=f, args=args, kwargs=kwargs, name=f.__name__)
thr.start()
break
else:
time.sleep(0.01)
return wrapper
return start_async
测试代码
@async(10)
def run():
time.sleep(1)
print('完毕')
if __name__ == '__main__':
while True:
print('当前线程活动数量:%s'%(threading.active_count()))
run()
运行效果
当前线程活动数量:1
当前线程活动数量:2
当前线程活动数量:3
当前线程活动数量:4
当前线程活动数量:5
当前线程活动数量:6
当前线程活动数量:7
当前线程活动数量:8
当前线程活动数量:9
当前线程活动数量:10
当前线程活动数量:11
当前线程活动数量:12
完毕
完毕
完毕
完毕
完毕
完毕
完毕
完毕
完毕
完毕
完毕
最后
通过这个方法能加深对装饰器的理解,并且在实际开发中也是比较实用的,不需要花费大量的时间去编写启动线程,建立线程池的代码