为什么pipe.close()在python多处理中的pipe.recv()期间不会导致EOFError?

Luk*_*uke 16 python multiprocessing

我使用Python的多处理模块使用管道在进程之间发送简单对象.文档说明如果管道已关闭,则调用pipe.recv()应该引发EOFError.相反,我的程序只是阻塞recv()并且永远不会检测到管道已经关闭.

例:

import multiprocessing as m

def fn(pipe):
    print "recv:", pipe.recv()
    print "recv:", pipe.recv()

if __name__ == '__main__':
    p1, p2 = m.Pipe()
    pr = m.Process(target=fn, args=(p2,))
    pr.start()

    p1.send(1)
    p1.close()  ## should generate EOFError in remote process
Run Code Online (Sandbox Code Playgroud)

输出看起来像:

recv: 1
<blocks here>
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?我在Linux和windows/cygwin上遇到了这个问题,但是没有使用windows native Python.

Nem*_*emo 9

分叉(子)进程继承其父级文件描述符的副本.因此,即使父级调用"close" p1,子级仍然打开一个副本,并且不会释放底层内核对象.

要修复,您需要关闭子管道中的"写入"侧,如下所示:

def fn(pipe):
    p1.close()
    print "recv:", pipe.recv()
    print "recv:", pipe.recv()
Run Code Online (Sandbox Code Playgroud)

  • 那么,为什么孩子只收到了孩子的连接,却仍收到父母的连接的副本?这是多处理实现的错误/副作用吗?它记录不充分。 (2认同)