这适用于Python 3.2.2。我只是学习Python和多处理工作的方式,这个简单的例子让我感到沮丧:
from multiprocessing import Pipe, Process
def f(r):
print(r.recv())
if __name__ == '__main__':
q, r = Pipe()
p = Process(target=f, args=(r,))
p.start()
q.send([42, None, 'hello'])
p.join()
主线程创建一个新的Process
,p
,并将r
(一个双向连接对象)发送到函数f()
。当进程p
启动时,我希望r.recv()
阻塞(根据我的理解,这意味着此进程将无限期地等待,直到某些东西通过管道),直到主进程发送一些对象为止与q.send
。
然后p.join()
应该让主进程等到p
运行完毕。
但是没有任何事情发生。如果我向print
添加f()
语句,那么也没有任何结果,好像f()
从未运行且p.start()
无效。
你能解释一下为什么这不会起作用以及可以修复什么?
答案 0 :(得分:1)
我知道已经有一段时间了,但是对于有这个问题的其他人来说,你的管道末端会被颠倒过来。您正尝试使用接收端发送,并尝试使用发送端接收。我发现在Pipe构造函数中添加duplex = True可以更容易地处理不同的目的。
来源:https://docs.python.org/2/library/multiprocessing.html#pipes-and-queues
答案 1 :(得分:0)
根据经验,我发现无法从我开始的流程打印。您可以尝试撤消您的计划:
from multiprocessing import Pipe, Process
def f(r):
r.send([42, None, 'hello'])
if __name__ == '__main__':
q, r = Pipe()
p = Process(target=f, args=(r,))
p.start()
print(q.recv())
p.join()