创建一个Thread子类MyThread
为了使子类TyThread更加通用,将该子类移入到一个专门的模块中,并添加了可调用的getResult()方法来返回取得的值
import threading
from time import sleep,ctime
class MyThread(threading.Thread):
def __init__(self,func,args,name = ''):
threading.Thread.__init__(self)
self.func = func#传进来函数
self.args = args#传进来参数
self.name = name#传进来函数名字
def getResult(self):
return self.res
def run(self):
#可以传递初始化函数参数的特殊方法
print('starting {0} at:{1}'.format(self.name,ctime()))
self.res = self.func(*self.args)
print('{0} finished at: {1}'.format((self.name,ctime())))
单线程和多线程执行对比
在这个多线程应用中,将先后使用单线程和多线程的方式分别执行三个独立的递归函数
from myThread import MyThread
from time import ctime,sleep
#斐波那契数列
def fib(x):
sleep(0.005)
if x<2:return 1
return (fib(x-2)+fib(x-1))
#阶乘
def fac(x):
sleep(0.1)
if x<2:return 1
return (x*fac(x-1))
#累加
def sum(x):
sleep(0.1)
if x<2:return 1
return (x+sum(x-1))
funcs = [fib,fac,sum]
n=12
def main():
nfuncs = range(len(funcs))
print('---------单线程运行--------------')
for i in nfuncs:
print('{0}开始于: {1}'.format(funcs[i].__name__,ctime()))
print('运行时间:{0}'.format(funcs[i](n)))
print('---------多线程运行--------------')
threads = []
for i in nfuncs:
#第一个参数 函数的名字,第二个参数 函数参数,第三个参数 函数名字
t = MyThread(funcs[i],(n,),funcs[i].__name__)
threads.append(t)
for i in nfuncs:
threads[i].start()
for i in nfuncs:
threads[i].join()
print(threads[i].getResult())
print('全部运行结束')
if __name__ == '__main__':
main()
运行结果
结果说明
方法run()是在线程start()方法调用的时候才开始运行加载的,在线程创建的时候,run()方法并没有开始初始化加载。