一提到多線程通常你們的第一感受就是能夠提高程序性能,在實際的操做中每每遇到性能的問題,都嘗試使用多線程來解決問題,但多線程程序並非在任何狀況下都能提高效率,在一些狀況下偏偏相反,反而會下降程序的性能。這裏給出兩個簡單的例子來講明下:性能優化
程序1:多線程
1 import threading 2 from time import ctime 3 4 class MyThread(threading.Thread): 5 def __init__(self, func, args, name): 6 threading.Thread.__init__(self) 7 self.name = name 8 self.func = func 9 self.args = args 10 11 def run(self): 12 print 'starting', self.name, 'at:',ctime() 13 apply(self.func, self.args) 14 print self.name, 'finished at:', ctime() 15 16 def fun1(x): 17 y = 0 18 for i in range(x): 19 y+=1 20 21 def fun2(x): 22 y = 0 23 for i in range(x): 24 y+=1 25 26 def main(): 27 print 'staring single thread at:',ctime() 28 fun1(10000000) 29 fun2(10000000) 30 print 'finished single thread at:',ctime() 31 32 t1 = MyThread(fun1,(10000000,),fun1.__name__) 33 t2 = MyThread(fun2,(10000000,),fun2.__name__) 34 t1.start() 35 t2.start() 36 t1.join() 37 t2.join() 38 39 print 'all done' 40 41 if __name__ == '__main__': 42 main()
該程序執行結果爲:併發
staring single thread at: Sat Dec 08 10:27:11 2012
finished single thread at: Sat Dec 08 10:27:14 2012
starting fun1 at: Sat Dec 08 10:27:14 2012
starting fun2 at: Sat Dec 08 10:27:14 2012
fun1 finished at:Sat Dec 08 10:27:21 2012
fun2 finished at:Sat Dec 08 10:27:21 2012
all doneapp
結果顯示對於一樣的問題多線程耗費了多一倍的時間,fun1,、fun2都是計算型程序,這就意味着兩個代碼都須要佔用CPU資源,雖然採用了多線 程但CPU資源是惟一的(不考慮多CPU多核的狀況),同一時刻只能一個線程使用,致使多線程沒法真正的併發,相反因爲線程的切換的開銷,效率反而有明顯 的降低。由此看以在單CPU的場景下對於計算密集型的程序,多線程並不能帶來效率的提高。ide
程序2:性能
1 import threading 2 from time import ctime 3 4 class MyThread(threading.Thread): 5 def __init__(self, func, args, name): 6 threading.Thread.__init__(self) 7 self.name = name 8 self.func = func 9 self.args = args 10 11 def run(self): 12 print 'starting', self.name, 'at:',ctime() 13 apply(self.func, self.args) 14 print self.name, 'finished at:', ctime() 15 16 def fun1(x): 17 for i in range(x): 18 fd = open('1','w') 19 fd.close() 20 21 def fun2(x): 22 y = 0 23 for i in range(x): 24 y+=1 25 26 def main(): 27 print 'staring single thread at:',ctime() 28 fun1(15000) 29 fun2(50000000) 30 print 'finished single thread at:',ctime() 31 32 t1 = MyThread(fun1,(15000,),fun1.__name__) 33 t2 = MyThread(fun2,(50000000,),fun2.__name__) 34 t1.start() 35 t2.start() 36 t1.join() 37 t2.join() 38 39 print 'all done' 40 41 if __name__ == '__main__': 42 main()
該程序執行結果爲:優化
staring single thread at: Sat Dec 08 11:03:30 2012
finished single thread at: Sat Dec 08 11:03:46 2012
starting fun1 at: Sat Dec 08 11:03:46 2012
starting fun2 at: Sat Dec 08 11:03:46 2012
fun2 finished at: Sat Dec 08 11:03:55 2012
fun1 finished at: Sat Dec 08 11:03:58 2012
all donespa
結果顯示這個程序採用多線程比單線程的效率有明顯的提高。這是因爲fun1主要是文件的操做,fun2是計算操做,單線程的狀況下,雖然兩個程序主 要使用不一樣的資源可是在線程內部只能串行執行,在IO操做的時候,CPU實際是無事可作。多線程的狀況下,若是一個線程在等待IO操做,線程會立刻調度到 另一個線程上,併發的使用了不一樣的資源。操作系統
結論:線程
線程自己因爲建立和切換的開銷,採用多線程不會提升程序的執行速度,反而會下降速度,可是對於頻繁IO操做的程序,多線程能夠有效的併發。
對於包含不一樣任務的程序,能夠考慮每一個任務使用一個線程。這樣的程序在設計上相對於單線程作全部事的程序來講,更爲清晰明瞭,好比生產、消費者問題。
在實際的開發中對於性能優化的問題須要考慮到具體的場景來考慮是否使用多線程技術。