我有一个子进程通过 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/