我如何知道儿童过程何时死亡?

时间:2010-09-09 10:20:22

标签: python synchronization ipc process multiprocessing

在我班上我运行4个过程。

from multiprocessing import Process

    procs = (
             Process(target=ClassOne, name='ClassOne'),
             Process(target=ClassTwo, name='ClassTwo'),
             Process(target=ClassThree, name='ClassThree'),
             Process(target=ClassFour, name='ClassFour'),
            )

    for p in procs:
        p.daemon = False
        p.start()

我希望在我的一个孩子过程死亡时得到通知,这样我就可以杀死另一个人和我的自己。

5 个答案:

答案 0 :(得分:3)

只需为 SIGCHLD 定义一个信号处理程序,检查刚死亡的孩子返回的帧,以检索你需要的信息......如果需要,也可以退出()父母:)< / p>

答案 1 :(得分:3)

可以使用os.waitpid()传递 -1 作为第一个参数, 0 作为第二个参数。

  • 第一个参数表示请求与当前进程的任何子进程有关。
  • 第二个参数表示它的行为为wait()

该函数返回一个元组,其中包含死子的pid及其退出代码。

答案 2 :(得分:1)

最简单的方法是明确等待所有进程完成。

while multiprocessing.active_children():
    pass

这不是您想要的事件驱动,但它会在您的示例中完成工作。另外请确保import multiprocessing

答案 3 :(得分:0)

您可能希望在this similar question的答案中查看AutoJoiningProcess类。

如果你准备在你的代码中添加对gobject(PyGTK的一部分)的依赖,那么AutoJoiningProcess将允许你可以监听进程完成时发出的信号。在那个信号上,你可以随后做出反应。

答案 4 :(得分:-2)

这是一个Windows解决方案。它使用WaitForMultipleObjects API调用。对于Unix os.waitpid可以完成这项工作。

import multiprocessing as mp
import ctypes


SYNCHRONIZE = 0x00100000
INFINITE = -1


def mbox(msg):
  ctypes.windll.user32.MessageBoxW(0, msg, u'spam', 0)


if __name__ == '__main__':

  # start 2 processes
  procs = [mp.Process(target=mbox, args=(msg,)) for msg in u'ab']
  for p in procs:
    p.start()

  # wait for at least one process to terminate
  handles = [
    ctypes.windll.kernel32.OpenProcess(SYNCHRONIZE, False, p.pid)
    for p in procs]
  array_type = ctypes.c_long * len(handles)
  handle_array = array_type(*handles)
  ctypes.windll.kernel32.WaitForMultipleObjects(
    len(handles), handle_array, False, INFINITE)

  # terminate the rest
  for p in procs:
    p.terminate()

  # exit
  print 'done'