多線程和單線程的執行效率問題


一提到多線程一般大家的第一感覺就是可以提升程序性能,在實際的操作中往往遇到性能的問題,都嘗試使用多線程來解決問題,但多線程程序並不是在任何情況下都能提升效率,在一些情況下恰恰相反,反而會降低程序的性能。這里給出兩個簡單的例子來說明下:

程序1:

View Code
import threading
from time import ctime

class MyThread(threading.Thread):
    def __init__(self, func, args, name):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args

    def run(self):
        print 'starting', self.name, 'at:',ctime()
        apply(self.func, self.args)
        print self.name, 'finished at:', ctime()

def fun1(x):
    y = 0
    for i in range(x):
        y+=1

def fun2(x):
    y = 0
    for i in range(x):
        y+=1
        
def main():
    print 'staring single thread at:',ctime()
    fun1(10000000)
    fun2(10000000)
    print 'finished single thread at:',ctime()

    t1 = MyThread(fun1,(10000000,),fun1.__name__)
    t2 = MyThread(fun2,(10000000,),fun2.__name__)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    
    print 'all done'
    
if __name__ == '__main__':
    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:

View Code
import threading
from time import ctime

class MyThread(threading.Thread):
    def __init__(self, func, args, name):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args

    def run(self):
        print 'starting', self.name, 'at:',ctime()
        apply(self.func, self.args)
        print self.name, 'finished at:', ctime()

def fun1(x):
    for i in range(x):
        fd = open('1','w')
        fd.close()

def fun2(x):
    y = 0
    for i in range(x):
        y+=1
        
def main():
    print 'staring single thread at:',ctime()
    fun1(15000)
    fun2(50000000)
    print 'finished single thread at:',ctime()

    t1 = MyThread(fun1,(15000,),fun1.__name__)
    t2 = MyThread(fun2,(50000000,),fun2.__name__)
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    
    print 'all done'
    
if __name__ == '__main__':
    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操作的程序,多線程可以有效的並發。

對於包含不同任務的程序,可以考慮每個任務使用一個線程。這樣的程序在設計上相對於單線程做所有事的程序來說,更為清晰明了,比如生產、消費者問題。

在實際的開發中對於性能優化的問題需要考慮到具體的場景來考慮是否使用多線程技術。

轉載請注明原始出處:http://www.cnblogs.com/chencheng/archive/2012/12/08/2808348.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM