python threading线程装饰器,可以获取线程结果

 根据网络资料整理,并进行了优化和测试,编写了python的thread线程装饰器,用于装饰函数

个人认为是完美版:装饰器使用方便,可以分别获取结果,也可以获取全部结果集合

如下:

from threading import Thread, currentThread
import time


class thread_wrap_class:
    '''
    函数的线程装饰器,返回thread线程实例,getResult获取结果,
    thread_wrap_class.getAllResult 获取结果集合
    '''
    Result_dict = {}
    thread_dict = {}

    class MyThread(Thread):
        def __init__(self, func, name='', *args, **kwargs):
            Thread.__init__(self)
            self.func = func
            self.name = name
            self.args = args
            self.kwargs = kwargs

        def run(self):
            print(f"{self} start with thread_wrap_class...")
            self.res = self.func(*self.args, **self.kwargs)
            thread_wrap_class.Result_dict[self.ident] = self.res

        def getResult(self):
            self.join()
            return self.res

    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        _mythr = self.MyThread(self.func, self.func.__name__, *args, **kwargs)
        _mythr.start()
        self.thread_dict[_mythr.ident] = _mythr
        return _mythr

    @classmethod
    def getAllResult(cls):
        for k, thr in cls.thread_dict.items():
            thr.join()
        return cls.Result_dict


def click(callback, *args, **kwargs):
    # print('in main func with <', callback.__name__, '>', *args, **kwargs)
    return callback(*args, **kwargs)


@thread_wrap_class
def event(s):
    time.sleep(s)
    global g_a
    g_a += s
    print(f'{currentThread()} < event > finished! {s} {g_a}')
    return 'event Result :' + str(s) + '|' + str(g_a)


g_a = 100
event(4)
a = event(5)
print('a:', a.getResult())
click(event, 3)
click(event, 6)
print('event all:', thread_wrap_class.getAllResult())

 

测试输出如下:

<MyThread(event, started 18024)> start with thread_wrap_class...

<MyThread(event, started 4636)> start with thread_wrap_class...

<MyThread(event, started 18024)> < event > finished! 4 104

<MyThread(event, started 4636)> < event > finished! 5 109

a: event Result :5|109

<MyThread(event, started 24920)> start with thread_wrap_class...

<MyThread(event, started 4012)> start with thread_wrap_class...

<MyThread(event, started 24920)> < event > finished! 3 112

<MyThread(event, started 4012)> < event > finished! 6 118

event all: {18024: 'event Result :4|104', 4636: 'event Result :5|109', 24920: 'event Result :3|112', 4012: 'event Result :6|118'}

符合预期,完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值