Python 通过信号终止子进程,但位置影响?

Python 通过信号终止子进程,但位置影响?,python,linux,Python,Linux,我使用信号函数终止mul process程序中的所有子进程,代码如下所示,另存为一个名为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

我使用信号函数终止mul process程序中的所有子进程,代码如下所示,另存为一个名为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)'移动到行'ifname='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,程序接收信号并调用函数项,但也不会终止任何子进程并自行退出,这是第二个问题。

程序中的一些问题-同意子进程将继承第二个代码段中的信号处理程序,但全局变量“进程”列表不会被共享。因此,流程列表只能与主流程一起使用。“流程”将是其他子流程的空列表。 您可以使用队列或管道类型的机制将进程列表传递给子进程。但这会带来另一个问题

您终止process1,process1的处理程序尝试终止process2到process4

现在进程2也有相同的处理程序

因此进程2处理程序再次尝试终止所有其他进程


这将把你的程序推入无限循环

谢谢你的回答。我再次尝试了第二个代码,当我用子进程pid kill-15时,我打印全局变量'processs',正如你所说,这是一个空列表,然后我用主进程pid kill-15,全局变量'processs'works,但我发现当调用函数term中的p.terminate()时,操作系统将向子进程发送信号SIGTERM,由于继承了相同的信号处理程序,但全局变量“processs”是一个空列表,因此程序不会像我所想的那样运行,但我仍然混淆了我写下行“signal.signal(signal.SIGTERM,term)”的位置,节目将显示不同的内容appearance@tourun你应该在任何地方,但在你开始一个新的过程。当我们创建一个子进程时,它会得到父进程地址空间的精确副本,因此父进程和子进程在创建子进程时都有单独的地址空间,但内容相同。