根据网络资料整理,并进行了优化和测试,编写了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'}
符合预期,完成!