我在多进程程序中使用signal函数杀掉所有子进程,代码如下,保存为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信号时,它在终止所有子进程后退出,但是当我对子进程pid使用kill -15时,它不起作用,程序仍然像以前一样运行,并且不打印函数术语中定义的句子,似乎子进程没有收到SIGTERM。据我所知,子进程将继承信号处理程序,但它不起作用,这是第一个问题。
然后我将行 'signal.signal(signal.SIGTERM, term)' 移动到行 'if name == 'main':' 之后,像这样:
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 但也不会杀死任何子进程并自行退出,这是第二个问题.
最佳答案
程序中的几个问题 - 同意子进程将继承第二个代码片段中的信号处理程序,但不会共享全局变量“进程”列表。因此,流程列表仅适用于主流程。 “流程”对于其他子流程将是空列表。 您可以使用队列或管道类型的机制将进程列表传递给子进程。但是会带来另一个问题
您终止 process1,process1 的处理程序尝试终止 process2 到 process4。
现在进程 2 也有相同的处理程序,
因此进程 2 处理程序再次尝试终止所有其他进程
这会将您的程序插入无限循环。
关于python - 通过信号杀死子进程,但位置影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35308299/