多线程装饰器完整实例(控制线程数量及简单使用)

11 篇文章 0 订阅
4 篇文章 0 订阅
  • 以下案例是通用的带参的类装饰器
  • 其他的带参与不带参函数装饰器以及不带参类装饰器案例详见本人博客内其他博文
import threading
import time


class NewThread(object):
    # __init__ : 不再接收被装饰函数,而是接收传入参数.
    # __call__ :接收被装饰函数,实现装饰逻辑.

    def __init__(self, max_thread=500):
        self.max_thread = max_thread

    def __call__(self, func):  # 接受函数
        from functools import wraps

        @wraps(func)
        def wrapper(*args, **kwargs):
            while True:
                # 获取已启动此函数线程的数量
                func_thread_active_count = len([i for i in threading.enumerate() if i.name == func.__name__])

                if func_thread_active_count <= self.max_thread:
                    # 待执行功能
                    # func(*args, **kwargs)
                    thread = threading.Thread(target=func, args=args, kwargs=kwargs, name=func.__name__)
                    # 把主线程设置为守护线程,主线程执行结束了,就不管子线程是否完成,一并和主线程退出
                    # thread.setDaemon(True)
                    thread.start()
                    # 子线程调用join()方法,使主线程等待子线程运行完毕之后才退出,与thread.setDaemon(True)相反
                    # thread.join()
                    break
                # else:
                #     time.sleep(0.01)

        return wrapper  # 返回函数


@NewThread(200)
def say(something):
    print("say {}!".format(something))
    time.sleep(1)


t1 = time.time()
for i in range(2000):
    say("hello")
t2 = time.time()
print('运行耗时:' + str(round(t2 - t1, 2)) + ' s')  # 50.19s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值