我正在使用带有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

输出结果如下:
recv: 1
<blocks here>

有人能告诉我我做错了什么吗?我在linux和windows/cygwin上有这个问题,但在windows本机python上没有。

最佳答案

分叉(子)进程正在继承其父进程的文件描述符的副本。因此,即使父级在p1上调用“close”,子级仍然有一个打开的拷贝,并且底层内核对象没有被释放。
要修复,您需要关闭子管道的“写入”侧,如下所示:

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

关于python - 为什么pipe.close()在python多处理中的pipe.recv()期间不会导致EOFError?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6564395/

10-12 20:18