自定义Thread类

threading类没有返回值,可以重新定义MyThread类实现有返回值
import threading
import time

class MyThread(threading.Thread):

    def __init__(self,func,args=()):
        super().__init__() #初始化父类属性
        self.func = func
        self.args = args

    def run(self):
        self.result = self.func(*self.args) #线程类实例start的时候先调用这个run方法,这个run方法会调用线程中target指定方法,指定方法返回值用self.result暂存。

    def get_result(self):
        try:
            return self.result  # 如果子线程不使用join方法,此处可能会报没有self.result的错误
        except Exception:
            return None


def foo(a,b,c):
    time.sleep(1)
    return a*2,b*2,c*2

st = time.time()
li = []
for i in range(4):
    t = MyThread(foo,args=(i,i+1,i+2))
    li.append(t)
    t.start()
# 执行遍历后会产生4个耗时线程,但不影响下面的遍历。
for t in li:
    t.join()  # 一定要join,不然主线程比子线程跑的快,会拿不到结果,主线程等待子线程执行结束。
    print(t.get_result())#每个线程实例都调用对应方法的返回值。

et = time.time()
print(et - st)
输出结果
(0, 2, 4)
(2, 4, 6)
(4, 6, 8)
(6, 8, 10)
1.0
本来四个耗时线程需要四秒执行完,使用多线程1秒钟执行完,相当于同时执行四个任务。

你可能感兴趣的:(教程,python)