Python多进程管道无法正确接收(recv())。

3

这是针对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运行结束。

但是什么也没有发生。如果我在f()中添加一个print语句,那里也没有任何反应,就像f()根本没有运行过,而p.start()也是无效的。
请问为什么这样做不起作用,如何修复?
2个回答

3
我知道已经有一段时间了,但是对于其他遇到这个问题的人来说,你需要交换管道的两端。你试图使用接收端发送数据,并且尝试使用发送端接收数据。我发现在Pipe构造函数中添加duplex=True选项可以更容易地处理不同的管道端点。
来源:https://docs.python.org/2/library/multiprocessing.html#pipes-and-queues

1

根据我的经验,我发现我无法从我启动的进程中打印。你可以尝试反转你的程序:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接