我使用signal函数来杀死mul-process程序中的所有子进程,代码显示为blow,保存为名为mul_process.py的文件:
import time
import os
import signal
from multiprocessing import Process
processes = []
def fun(x):
print 'current sub-process pid is %s' % os.getpid()
while True:
print 'args is %s' % x
time.sleep(100)
def term(sig_num, frame):
print 'terminate process %d' % os.getpid()
for p in processes:
print p.pid
try:
for p in processes:
print 'process %d terminate' % p.pid
p.terminate()
p.join()
except Exception as e:
print str(e)
if __name__ == '__main__':
print 'current main-process pid is %s' % os.getpid()
for i in range(3):
t = Process(target=fun, args=(str(i),))
t.start()
processes.append(t)
signal.signal(signal.SIGTERM, term)
try:
for p in processes:
p.join()
except Exception as e:
print str(e)
使用' python mul_process.py'在Ubuntu 10.04.4和Python 2.6上启动程序,当它开始运行时,在另一个选项卡中,我使用kill -15与主进程pid发送信号SIGTERM以终止所有进程,当主进程收到信号SIGTERM时,它在终止所有子进程后退出,但是当我使用kill -15和子进程pid时,它不起作用,程序仍然活着并且像以前一样运行,并且不打印函数术语中定义的句子,似乎是子进程没有收到SIGTERM。据我所知,子进程将继承信号处理程序,但它不起作用,这是第一个问题。
然后我移动线' signal.signal(signal.SIGTERM,term)'如果名称 ==' 主要':',就像这样:
if __name__ == '__main__':
signal.signal(signal.SIGTERM, term)
print 'current main-process pid is %s' % os.getpid()
for i in range(3):
t = Process(target=fun, args=(str(i),))
t.start()
processes.append(t)
try:
for p in processes:
p.join()
except Exception as e:
print str(e)
启动程序,并使用kill -15与主进程pid发送信号SIGTERM,程序接收信号并调用函数term但也不杀死任何子进程并退出自己,这是第二个问题。
答案 0 :(得分:1)
程序中几乎没有问题 - 同意子进程将继承第二个代码片段中的信号处理程序,但不会共享全局变量“进程”列表。因此,仅主流程可以使用流程列表。 “进程”将是其他子进程的空列表。 您可以使用队列或管道类型的机制将进程列表传递给子进程。但它会带来另一个问题
您终止process1并且process1的处理程序尝试将process2终止为process4。
现在,进程2也有相同的处理程序,
So Process 2 handler again try to terminate all other process
将推动您的程序进入无限循环。