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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值