这个Python多处理代码有什么问题?

时间:2014-06-13 17:16:25

标签: python multiprocessing

我正在尝试为我的项目创建一些多处理代码。我创建了一些我想做的事情片段。然而,它没有按照我的期望工作。能告诉我这有什么不妥吗?

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"

按ctrl-c时显示回溯:

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

当我运行上面的代码时,主进程在调用&#34; proc_handle.run&#34;后不会继续。这是为什么?

2 个答案:

答案 0 :(得分:1)

您误解了如何使用Process。您正在创建一个Process对象,并将其作为target传递给它,但target意味着传递一个Process.run然后执行的可调用(通常是函数) 。所以在你的情况下,它只是在A内实例化Process.run,就是这样。

您应该将A类设为Process子类,并直接实例化它:

#!/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

通过这些更改,该程序适用于我:

dan@dantop:~> ./mult.py 
In the function fun()
in run method
HELLO
Back in the main function now

答案 1 :(得分:0)

我认为这是因为你打电话给proc_handle.run()而不是proc_handle.start()

前者是流程要执行的活动 - 后者实际上安排在单独的流程上调用run。换句话说,您永远不会分支流程,因此my_pipe_1[1]没有其他流程可以与之通信,因此它会挂起。