python的多线程不是真正的多线程,所以使用多进程来实现高并发,比如训练模型读取数据时,但是kill只会杀死相应的进程ID,由于真实环境下子进程太多,一个一个去kill太麻烦,下面实现了只需要杀死主进程id即可同时使子进程也退出:

  1.主进程和子进程的进程组ID是一样的,通过杀死进程组ID使主进程和子进程都退出 

  2.通过signal.signal(signal.SIGTERM, term)注册操作系统信号量处理方法

from multiprocessing import Process
import os
import time
import signal

def gan_huo_de_jin_cheng(x):
    print('fun current pid is %s, group id is %s' % (os.getpid(), os.getpgrp()))
    while True:
        print('args is %s ' % x)
        time.sleep(1)

def term(sig_num, addtion):
    print('term current pid is %s, group id is %s' % (os.getpid(), os.getpgrp()))
    os.killpg(os.getpgid(os.getpid()), signal.SIGKILL)

signal.signal(signal.SIGTERM, term)
print('master pid is %s' % os.getpid())

for i in range(3):
    t = Process(target=gan_huo_de_jin_cheng, args=(str(i),))
    t.daemon = True
    t.start()

# 不管是ctrl+c还是kill -15 master pid还是主进程运行完毕,主进程和子进程都能正常退出
i = 0
while True:
    if i >= 50:
        break
    print('this is master')
    time.sleep(1)
    i += 1

  会抛出异常,不过不需要处理。