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