我正在尝试为我的项目创建一些多处理代码。我创建了一些我想做的事情片段。然而,它没有按照我的期望工作。能告诉我这有什么不妥吗?
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;后不会继续。这是为什么?
答案 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]
没有其他流程可以与之通信,因此它会挂起。