Python多处理管道将无法正确recv()

时间:2012-05-04 04:49:07

标签: python multiprocessing pipe pydev

这适用于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()

主线程创建一个新的Processp,并将r(一个双向连接对象)发送到函数f()。当进程p启动时,我希望r.recv()阻塞(根据我的理解,这意味着此进程将无限期地等待,直到某些东西通过管道),直到主进程发送一些对象为止与q.send

然后p.join()应该让主进程等到p运行完毕。

但是没有任何事情发生。如果我向print添加f()语句,那么也没有任何结果,好像f()从未运行且p.start()无效。

你能解释一下为什么这不会起作用以及可以修复什么?

2 个答案:

答案 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()