有时候我们可能会遇到这样的需求:
有一个调度程序会周期性的读取任务来调度,并且这些任务的执行时间比较长,我们想要在调度程序退出或Ctrl+c中断时不要影响其启动的任务。使用python实现如下:
import os
import time
from multiprocessing import Process
import signal
def signal_handler(signum, frame):
print(f"Receive signal {signum}, pid: {os.getpid()}")
def func():
if os.fork() != 0: # double-fork
return
# 该进程会被1号进程收养,但是其仍然属于主进程的进程组成员
# 当终端结束主进程时会发送SIGINT信号给进程组成员,导致本进程结束
os.setpgrp() # 使该进程脱离原来的进程组成为新的进程组组长,在Ctrl+c时不会被中断
# ...
signal.signal(signal.SIGTERM, signal_handler)
print('sub process is running')
time.sleep(5)
print('sub process finished')
if __name__ == '__main__':
p = Process(target=func)
p.start()
print('done')