python - multiprocessing.Queue 在进程结束时挂起

标签 python multiprocessing

我有一个子进程通过 multiprocessing.Process 和一个队列通过 multiprocessing.Queue

主要进程使用multiprocessing.Queue.get() 获取一些新数据。我不想在那里有超时,我希望它被阻塞。

然而,当子进程因任何原因(由用户通过kill 或 segfault 等手动终止)终止时,Queue.get() 将挂起永远。

我怎样才能避免这种情况?

最佳答案

我认为 multiprocessing.Queue 不是我想要的。

我正在使用

parent_conn, child_conn = multiprocessing.Pipe(duplex=True)

获取两个 multiprocessing.Connection 对象。然后我 os.fork() 或使用 multiprocessing.Process。在 child 身上,我这样做:

parent_conn.close()
# read/write on child_conn

在父级中(在 fork 之后),我这样做:

child_conn.close()
# read/write on parent_conn

这样,当我在连接上调用 recv() 时,它会在子/父进程同时死亡时引发异常 (EOFError)。

请注意,这仅适用于单个 child 。我想 Queue 是指当你想要多个 child 时。在那种情况下,您可能无论如何都会有一些管理器来监视所有 child 是否还活着并相应地重新启动它们。

关于python - multiprocessing.Queue 在进程结束时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28896055/

相关文章:

python - 写入 selenium 数据时 CSV 为空

python - ValueError : Error when checking target: expected time_distributed_7 to have 4 dimensions, 但得到形状为 (500, 18, 64) 的数组

python - 广播两个不同形状的数组(Numpy-Python)

Python 多处理/队列与cherrypy

python - 如何在 "background"中运行部分脚本(单个函数)?

python - 如何在 Sphinx 中的方法内自动编写函数

python - 指定和不指定 dtype 的 numpy.array 行为很奇怪

python - Python 中真正的并行性

Python 在使用 multiprocessing.pool.map() 调用的函数中增加一个数字

python - 在多处理进程之间共享大型只读 Numpy 数组