2

这适用于 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一个双向连接对象给 function f()。当进程p启动时,我希望r.recv()阻塞(据我所知,这意味着这个进程将无限期地等待,直到有东西通过管道),直到主进程通过 with 发送一些对象q.send

然后p.join()应该让主进程等到p运行它的过程。

但是什么都没有发生。如果我向 中添加一条print语句f(),那里也不会发生任何事情,就好像f()从来没有运行过并且p.start()没有功能一样。

您能解释一下为什么这不起作用以及可以解决的问题吗?

4

2 回答 2

3

我知道这已经有一段时间了,但对于其他有这个问题的人,你的管道末端颠倒了。您正在尝试使用接收端发送,并尝试使用发送端接收。我发现将 duplex=True 添加到 Pipe 构造函数可以更轻松地处理不同的端。

来源:https ://docs.python.org/2/library/multiprocessing.html#pipes-and-queues

于 2014-07-23T15:05:46.247 回答
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()
于 2013-10-25T19:40:51.033 回答