一提到多線程一般大家的第一感覺就是可以提升程序性能,在實際的操作中往往遇到性能的問題,都嘗試使用多線程來解決問題,但多線程程序並不是在任何情況下都能提升效率,在一些情況下恰恰相反,反而會降低程序的性能。這里給出兩個簡單的例子來說明下:
程序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 done
結果顯示對於同樣的問題多線程耗費了多一倍的時間,fun1,、fun2都是計算型程序,這就意味着兩個代碼都需要占用CPU資源,雖然采用了多線 程但CPU資源是唯一的(不考慮多CPU多核的情況),同一時刻只能一個線程使用,導致多線程無法真正的並發,相反由於線程的切換的開銷,效率反而有明顯 的下降。由此看以在單CPU的場景下對於計算密集型的程序,多線程並不能帶來效率的提升。
程序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 done
結果顯示這個程序采用多線程比單線程的效率有明顯的提升。這是由於fun1主要是文件的操作,fun2是計算操作,單線程的情況下,雖然兩個程序主 要使用不同的資源但是在線程內部只能串行執行,在IO操作的時候,CPU實際是無事可做。多線程的情況下,如果一個線程在等待IO操作,線程會馬上調度到 另外一個線程上,並發的使用了不同的資源。
結論:
線程本身由於創建和切換的開銷,采用多線程不會提高程序的執行速度,反而會降低速度,但是對於頻繁IO操作的程序,多線程可以有效的並發。
對於包含不同任務的程序,可以考慮每個任務使用一個線程。這樣的程序在設計上相對於單線程做所有事的程序來說,更為清晰明了,比如生產、消費者問題。
在實際的開發中對於性能優化的問題需要考慮到具體的場景來考慮是否使用多線程技術。