python3子进程的子进程的残留问题复现

发布时间 2024-01-04 16:56:08作者: 沙滩炒花蛤

主进程创建子进程,子进程运行会创建自己的子进程(子子进程),这两个子进程运行都会输出自己正在运行,在子进程运行过程中,主进程杀掉子进程,子进程被杀死了,表面上看不输出东西了,而子子进程还在运行,还在继续往外输出信息。这个时候需要手动查一下子子进程的进程号(如 ps aux | grep python),然后手动杀死

join会阻塞等待子进程结束,但是我的要求是子进程要进入循环干活。。于是注释掉了

尝试在子进程内部加信号注册,收到kill信号就啥子子进程,但是加了信号注册后会阻塞子进程进入循环,于是注释吊了。

感觉是代码写的有问题

import multiprocessing
import time
import signal

def receive_signal(signum, frame):
    print('Signal handler called with signal', signum)
    
def grandchild():
    print("子子进程正在运行...")
    # time.sleep(5) # 模拟子子进程执行时间
    while True:
        print("子子进程正在运行...")
        time.sleep(1)
    print("子子进程执行完毕")
    
def child_process():
    print("子进程正在运行...")

    # 创建一个子子进程
    grandchild_process = multiprocessing.Process(target=grandchild)

    # 启动子子进程
    grandchild_process.start()

    # 等待子子进程执行完毕
    # grandchild_process.join()
    
    # 注册SIGKILL信号处理程序,应该在主线程设置的
    # signal.signal(signal.SIGKILL, receive_signal)
    while True:
        print("子进程正在运行...")
        time.sleep(1)
    print("子进程执行完毕")


if __name__ == "__main__":
    # 创建一个子进程
    sub_process = multiprocessing.Process(target=child_process)

    # 启动子进程
    sub_process.start()

    # 等待子进程执行完毕
    # sub_process.join()
    time.sleep(4)
    # 子进程执行完毕,强制关闭子进程
    sub_process.kill()

    print("主进程执行完毕")

运行结果如下:

$ python test.py 
子进程正在运行...
子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子进程正在运行...
子子进程正在运行...
子进程正在运行...
子子进程正在运行...
子进程正在运行...
子子进程正在运行...
主进程执行完毕
子子进程正在运行...
$ 子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...

可以看到“主进程执行完毕”后,就没有输出“子进程正在运行...”,然后一直有“子子进程正在运行...”的输出