在我班上我运行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()
我希望在我的一个孩子过程死亡时得到通知,这样我就可以杀死另一个人和我的自己。
答案 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'