2016-08-26 84 views
4

我有下面的代碼:Python的多線程VS多重VS順序執行

  • 第一順序執行ALONE(看註釋代碼和註釋:

    import time 
    from threading import Thread 
    from multiprocessing import Process 
    
    def fun1(): 
    
    for _ in xrange(10000000): 
         print 'in fun1' 
         pass 
    
    def fun2(): 
    
    for _ in xrange(10000000): 
         print 'in fun2' 
         pass 
    
    def fun3(): 
    
    for _ in xrange(10000000): 
         print 'in fun3' 
         pass 
    
    def fun4(): 
    
    for _ in xrange(10000000): 
         print 'in fun4' 
         pass 
    
    if __name__ == '__main__': 
    
        #t1 = Thread(target=fun1, args=()) 
        t1 = Process(target=fun1, args=()) 
        #t2 = Thread(target=fun2, args=()) 
        t2 = Process(target=fun2, args=()) 
        #t3 = Thread(target=fun3, args=()) 
        t3 = Process(target=fun3, args=()) 
        #t4 = Thread(target=fun4, args=()) 
        t4 = Process(target=fun4, args=()) 
        t1.start() 
        t2.start() 
        t3.start() 
        t4.start() 
        start = time.clock() 
        t1.join() 
        t2.join() 
        t3.join() 
        t4.join() 
        end = time.clock() 
        print("Time Taken = ",end-start) 
    
        ''' 
        start = time.clock() 
        fun1() 
        fun2() 
        fun3() 
        fun4() 
        end = time.clock() 
        print("Time Taken = ",end-start) 
        ''' 
    

    我用三種方式運行上面的程序上面的代碼)

  • 第二個多線程執行ALONE
  • 第三個多處理執行ALONE

爲END_TIME啓動時間的觀察結果如下:

總體運行時間

  • ( '拍攝時間=',342.5981313667716)---由線程執行運行時間
  • ('拍攝時間=',232.94691744899296)---運行時間順序執行
  • ( '拍攝時間=',307.91093406618216)由多重執行---運行時間

問:

我看到的順序執行需要最少的時間和多線程具有最高的時間。爲什麼?我無法理解,也感到驚訝的結果。請澄清。

由於這是一項CPU密集型任務,並且獲得了GIL,我的理解是 多處理時間最短,而線程執行時間最長。請驗證我的理解。

回答

5

您使用time.clock,它給了你CPU時間而不是實時的:你不能在你的情況下使用它,因爲它給你執行時間(你使用CPU運行你的代碼多久了,這將會幾乎同一時間,這些情況)

time.time()代替time.clock運行你的代碼給了我這些時我的電腦上:

Process : ('Time Taken = ', 5.226783990859985) 
seq : ('Time Taken = ', 6.3122560000000005) 
Thread : ('Time Taken = ', 17.10062599182129) 

這裏給出的任務(印刷)是如此之快,使用多處理的速度幾乎與開銷相平衡。

對於Threading,由於GIL只能運行一個線程,因此最終會按順序運行所有函數,但是您有線程開銷(每改變一次線程,每次迭代的花費可能會高達幾毫秒) 。所以你最終會慢得多。

Threading是有用的,如果你有等待時間,所以你可以運行之間的任務。

Multiprocessing對於昂貴的計算任務非常有用,如果可能的話完全獨立(無共享變量)。如果你需要共享變量,那麼你必須面對GIL,這有點複雜(但大多數時候並非不可能)。

編輯:其實,使用time.clock像你一樣給了你多少開銷使用ThreadingMultiprocessing花費你的信息。

0

基本上你是對的。 你用什麼平臺來運行代碼片段?我猜Windows。 請注意,「打印」不是CPU綁定所以你應該註釋掉「打印」,並嘗試在Linux上運行它來查看差異(它應該是你期望的)。 使用類似代碼:

def fun1(): 

for _ in xrange(10000000): 
     # No print, and please run on linux 
     pass