python3子进程的子进程的残留问题复现
主进程创建子进程,子进程运行会创建自己的子进程(子子进程),这两个子进程运行都会输出自己正在运行,在子进程运行过程中,主进程杀掉子进程,子进程被杀死了,表面上看不输出东西了,而子子进程还在运行,还在继续往外输出信息。这个时候需要手动查一下子子进程的进程号(如 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
子进程正在运行...
子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子进程正在运行...
子子进程正在运行...
子进程正在运行...
子子进程正在运行...
子进程正在运行...
子子进程正在运行...
主进程执行完毕
子子进程正在运行...
$ 子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
子子进程正在运行...
可以看到“主进程执行完毕”后,就没有输出“子进程正在运行...”,然后一直有“子子进程正在运行...”的输出