gpt4 book ai didi

Python 多处理管道 recv() 文档不清楚还是我遗漏了什么?

转载 作者:太空狗 更新时间:2023-10-30 00:46:29 24 4
gpt4 key购买 nike

我最近一直在学习如何使用 Python 多处理模块,并阅读了官方文档。在 16.6.1.2. Exchanging objects between processes有一个关于使用管道交换数据的简单示例。

并且,在 16.6.2.4. Connection Objects ,有这样一条语句,引用“如果没有任何东西可以接收并且另一端已关闭,则引发 EOFError。”

因此,我修改了示例,如下所示。恕我直言,这应该触发 EOFError 异常:未发送任何内容且发送端已关闭。

修改后的代码:

from multiprocessing import Process, Pipe

def f(conn):
#conn.send([42, None, 'hello'])
conn.close()

if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
#print parent_conn.recv() # prints "[42, None, 'hello']"
try:
print parent_conn.recv()
except EOFError:
pass
p.join()

但是,当我在我的 Ubuntu 11.04 机器 Python 2.7.2 上尝试修改后的示例时,脚本挂起。

如果有人能指出我遗漏了什么,我将不胜感激。

最佳答案

当您使用 mp.Process 启动新进程时,子进程会继承父进程的管道。当子进程关闭 conn 时,父进程仍有 child_conn 打开,因此管道文件描述符的引用计数仍大于 0,因此不会引发 EOFError。

要获得 EOFError,请关闭父进程和子进程中的管道末端:

import multiprocessing as mp

def foo_pipe(conn):
conn.close()

def pipe():
conn = mp.Pipe()
parent_conn, child_conn = conn
proc = mp.Process(target = foo_pipe, args = (child_conn, ))
proc.start()
child_conn.close() # <-- Close the child_conn end in the main process too.
try:
print(parent_conn.recv())
except EOFError as err:
print('Got here')
proc.join()

if __name__=='__main__':
pipe()

关于Python 多处理管道 recv() 文档不清楚还是我遗漏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594909/

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