2

我是多處理/多線程模塊中的新手,我試圖檢查它是否可以提高我的程序速度。問題是它返回意外的值。我也試過threading.Thread而不是multiprocessing.Process,發生同樣的問題 - 運行速度比不使用另一個線程慢。多處理/多線程 - 不提高速度 - Python

在這個例子中,我使用了多處理模塊,但是當我嘗試多線程(差異在註釋中)時,它幾乎相同 下面是打印2個函數順序運行的時間和這些函數並行運行的時間:

import time 
from threading import Thread 
from multiprocessing import Process 
import MyFile 

    class PerformanceTesting: 

     def __init__(self): 
      self.clss = MyFile.MyClass('A') 
      self.p1 = Process(target=self.f1) # I've tried also t1 = Thread(target=f1) 
      self.p2 = Process(target=self.f2) # I've tried also t2 = Thread(target=f2) 

     def f1(self): 
      results = self.clss.doSomething(arg,arg) 
      print results 

     def f2(self): 
      results = self.clss.doSomething(arg,arg) 
      print results 

    if __name__ == "__main__": 
     perf = PerformanceTesting() 

     # ATTEMPT USING MULTIPROCESSING 
     start = time.time() 
     perf.p1.start() 
     perf.f2() 
     perf.p1.join() 
     print time.time()-start 

     # ATTEMPT WITHOUT USING MULTIPROCESSING 
     start = time.time() 
     perf.f1() 
     perf.f2() 
     print time.time()-start 

你能告訴我是否有可能提高這個例子的速度? 我做錯了什麼?

我有一個想法:是不是因爲分成更多的進程或線程需要幾秒鐘,所以它不能幫助在結果必須在一秒鐘內返回的情況下?

+2

'doSomething()'方法做了什麼?它主要是I/O(例如讀寫文件,網絡等)還是CPU(數字處理,數據處理等)?在Python下,線程對前者更好,後者處理更好。 – Kevin 2014-11-06 19:45:14

+0

@Kevin CPU(使用字符串操作),是否有區別?謝謝 – 2014-11-06 19:47:09

+1

比'doSomething()'做的更重要的是運行需要多長時間?如果函數在很短的時間內完成,引入子進程可能不會引起顯着差異,並且可能最終變慢。 – dano 2014-11-06 19:48:13

回答

0

有跡象表明,看看這裏離我,因爲你想要做什麼,至少幾件事情:

perf.p1.start() 
perf.f2() 
perf.p1.join() 

這將啓動過程p1,然後執行f2,但然後等待P1到通過p1.join()完成。這似乎擊敗了多處理的目的 - 從你的文章中,我假設你認爲在單獨的線程上運行一個進程會使其運行得更快 - 不幸的是,除非你物理上獲得了更好的CPU,否則這絕不會是這樣。

多處理的要點是,你的代碼可以觸發一個線程的start函數,然後忘記它,直到它完成,同時與其他事情相處。重要的是,除非您開始將代碼劃分爲並行運行的許多不同部分,以便他們可以在單獨的基礎上快速完成,否則與其他人相比,在執行相同的代碼。

你能在這種情況下,做的是:

perf.p1.start() 
perf.p2.start() 
... do some more code, after which something happens when these two finish. 

這將直接通過對代碼的下一個部分,而不必等待你的函數來完成,這將阻止功能阻塞主線程。您必須實施信號/插槽系統才能在完成時實際觸發某個操作。

希望這會有所幫助。