2014-06-13 53 views
0

我想爲我的項目創建一些多處理代碼。我已經創建了我想要做的事情的片段。然而它沒有按照我的預期工作。你能不能讓我知道這有什麼問題。這個Python多處理代碼有什麼問題?

^CTraceback (most recent call last): 
File "sim.py", line 22, in <module> 
message = my_pipe_2[0].recv() 
KeyboardInterrupt 

當我運行這個上面的代碼,主要工藝不叫「proc_handle.run」後繼續:當我按Ctrl-C

from multiprocessing import Process, Pipe 
import time 

class A: 
     def __init__(self,rpipe,spipe): 
      print "In the function fun()" 

     def run(self): 
      print"in run method" 
      time.sleep(5) 
      message = rpipe.recv() 
      message = str(message).swapcase() 
      spipe.send(message) 

workers = [] 
my_pipe_1 = Pipe(False) 
my_pipe_2 = Pipe(False) 
proc_handle = Process(target = A, args=(my_pipe_1[0], my_pipe_2[1],)) 
workers.append(proc_handle) 
proc_handle.run() 
my_pipe_1[1].send("hello") 
message = my_pipe_2[0].recv() 
print message 
print "Back in the main function now" 

的追溯顯示。爲什麼是這樣?

+0

很抱歉的格式,我無法正確地在此編輯器進行格式化。 – hemanths

+0

你會收到任何類型的錯誤消息嗎? – Andy

+0

什麼是「ph.run」?我沒有看到代碼中的任何地方... – mgilson

回答

0

在這一個刺傷,我認爲這是因爲你打電話proc_handle.run()而不是proc_handle.start()

前者是過程要做的活動 - 後者實際上安排在一個單獨的過程中調用run。換句話說,你永遠不會爲流程付出代價,所以沒有其他的流程可以與之溝通,所以它會掛起。

+0

嘗試過'proc_handle.start()'也沒有運氣。面對相同的問題 – hemanths

1

您誤解了如何使用Process。您正在創建一個Process對象,並將它作爲target傳遞給一個類,但target旨在傳遞一個可調用(通常是一個函數),然後Process.run執行。所以在你的情況下,它只是在Process.run內實例化A,就是這樣。

而應該讓你的AProcess子類,而直接實例化它:

#!/usr/bin/python 

from multiprocessing import Process, Pipe 
import time 

class A(Process): 
     def __init__(self,rpipe,spipe): 
      print "In the function fun()" 
      super(A, self).__init__() 
      self.rpipe = rpipe 
      self.spipe = spipe 

     def run(self): 
      print"in run method" 
      time.sleep(5) 
      message = self.rpipe.recv() 
      message = str(message).swapcase() 
      self.spipe.send(message) 

if __name__ == "__main__":  
    workers = [] 
    my_pipe_1 = Pipe(False) 
    my_pipe_2 = Pipe(False) 
    proc_handle = A(my_pipe_1[0], my_pipe_2[1]) 
    workers.append(proc_handle) 
    proc_handle.start() 
    my_pipe_1[1].send("hello") 
    message = my_pipe_2[0].recv() 
    print message 
    print "Back in the main function now" 

mgilson是正確的,但。您應該撥打start()而不是run(),以使A.run在子進程中執行。

有了這些變化,程序爲我工作得很好:

[email protected]:~> ./mult.py 
In the function fun() 
in run method 
HELLO 
Back in the main function now 
+0

感謝達諾,它幫助我瞭解現在。如果我必須使用threading.Thread創建一個新線程,它是否也是如此?我將不得不只做類A繼承線程。線程? – hemanths

+0

@hemanths是的,'Process'的設計基本上是'Thread'的簡單替代品,所以在兩者之間切換時很少需要做任何修改。 – dano

+0

@hemanths雖然我不知道''threading''等同於'multiprocessing.Pipe'。您可能希望使用'Queue.queue',而不是切換到線程。 – dano