python - 通过信号杀死子进程,但位置影响?

标签 python linux

我在多进程程序中使用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 == 'ma​​in':' 之后,像这样:

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/

相关文章:

python - Tensorboard 中重复的所有变量是什么?

ruby - 如何在我的 Linux 服务器上运行 Ruby 代码?

python - 泡菜.PicklingError : Can't pickle <function past_match_sim at 0x7fa26e03b7b8>: attribute lookup past_match_sim on __main__ failed

c++ - 安装 kumofs 时出错

python - 声明的变量出现名称错误

javascript - Flask 和 Angular Web 应用程序路由

Python - 线性回归 TypeError : invalid type promotion

python - 如何在 asyncio 服务器中实现超时?

r - 在 windows 和 linux 中使用 R 的不同结果

linux - 如何从 rsync 中排除两台服务器上都存在的目录?