gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:07:42 30 4
gpt4 key购买 nike

我正在使用管道和 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 上没有

最佳答案

fork (子)进程正在继承其父进程的文件描述符的副本。因此,即使父级在 p1 上调用“关闭”,子级仍然有一个副本打开并且底层内核对象没有被释放。

要修复,您需要关闭子管道的“写入”端,如下所示:

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com