先自定義一個線程的子類,這個跟Java很像,主要功能的實現實在run方法裏面
# -*- coding: utf8 -*-
import threading
import time
class MyThread(threading.Thread):
'''
這個是自定義線程的子類
'''
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args
def getResult(self):
return self.res
def run(self):
print 'this is the method run starting %s at %s ' % (self.name,time.ctime())
#用於當函數參數已經存在於一個元組或字典中時,間接地調用函數
self.res = apply(self.func,self.args)
print '%s finnishing at %s \n' % (self.name,time.ctime())
在寫一個測試的類,Python可以把方法傳到某個類裏面,這個比較神奇的
看代碼:
# -*- coding: utf8 -*-
import time
import sys
import datetime
#在同一個目錄下面可以直接引用
import MyThread
def fib(x):
time.sleep(0.05)
if x<2:return 1
return (fib(x-2) +fib(x-1))
def fac(x):
time.sleep(0.1)
if x<2:return 1
return (x*fac(x-1))
def sum_(x):
time.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 '******SINGLE THREAD START******'
Tstarttime = datetime.datetime.now()
Sstarttime = datetime.datetime.now()
for i in nfuncs:
print 'start ',funcs[i].__name__,'at : ',\
time.ctime()
starttime = datetime.datetime.now()
print funcs[i](n)
endtime = datetime.datetime.now()
print funcs[i].__name__,(endtime - starttime).seconds,'s'
print funcs[i].__name__,'finnished ','at : ',\
time.ctime()
Sendtime = datetime.datetime.now()
print 'SINGLE THREAD TIME ',(Sendtime - Sstarttime).seconds,'s'
Mstarttime = datetime.datetime.now()
print '******MULTIPLE THREAD START*****'
threads = []#用來存放線程
for i in nfuncs:
#MyThread.MyThread,要注意,不要直接MyThread只是模塊,要引用到裏面的類才行,否則
#報TypeError: 'module' object is not callable 錯誤
t = MyThread.MyThread(funcs[i],(n,),funcs[i].__name__)
threads.append(t)
for i in nfuncs:
threads[i].start()
for i in nfuncs:
#當前進程的其他線程調用了join方法之後,會阻塞當前進程等待其他線程執行完在往下執行,可以給join設置超時參數
threads[i].join()
print i
print threads[i].getResult()
Mendtime = datetime.datetime.now()
print 'MULTIPLE THREAD TIME ',(Mendtime - Mstarttime).seconds,'s'
Tendtime = datetime.datetime.now()
print 'TOTAL TIME ',(Tendtime - Tstarttime).seconds,'s'
print 'ALL DONE'
if __name__ == '__main__':
main()
最後在看一下結果: