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.
分叉(子)进程继承其父级文件描述符的副本.因此,即使父级调用"close" p1,子级仍然打开一个副本,并且不会释放底层内核对象.
要修复,您需要关闭子管道中的"写入"侧,如下所示:
def fn(pipe):
p1.close()
print "recv:", pipe.recv()
print "recv:", pipe.recv()
Run Code Online (Sandbox Code Playgroud)