2012-09-23 213 views
1
# multi-processes 
from multiprocessing import Process, Queue 
class Worker(object): 
    def __init__(self, queue): 
     self.queue = queue 
     self.process_num = 10 <------------ 10 processes 
     self.count = 0 

    def start(self): 
     for i in range(self.process_num): 
      p = Process(target = self.run) 
      p.start() 
      p.join() 

    def run(self): 
     while True: 
      self.count += 1 
      user = self.queue.get() 
      # do something not so fast like time.sleep(1) 
      print self.count 
      if self.queue.empty(): 
       break 

我使用Worker().start(queue)來啓動程序,但輸出速度沒有我想象的那麼快(似乎只有一個進程正在運行)。爲什麼我的python多進程代碼運行速度很慢?

我的代碼有問題嗎?

回答

3

是的,你一次只運行一個進程,你在等待每個進程在開始下一個進程之前終止;

def start(self): 
    for i in range(self.process_num): 
     p = Process(target = self.run) 
     p.start()      <-- starts a new process 
     p.join()      <-- waits for the process to terminate 

換句話說,你開始10個進程,但第二個將無法啓動,直到第一個終止等。

對於您要做的事情,最好不要手動使用Process,而應使用Process Pool

+0

謝謝,這是有道理的,但如果我想手動使用它,我應該在哪裏放入連接方法?我希望我的主進程等待這些子進程。 – MrROY

+0

棘手的一個。如果可以等待所有進程終止,那麼就像現在這樣循環並將進程添加到數組中。當你完成所有的開始時,只需循環數組和Join()它們。如果主進程要繼續執行其他事情,則需要偶爾(主循環)運行數組,並以超時0運行Join(),以跟蹤哪些進程已終止並將其從數組中移除。邊注;我不知道有什麼方法在子進程終止時得到通知,但我總是使用進程池,因此可能有一種我不知道的方式。 –

+0

感謝Joachim。 – MrROY

相關問題