如何使用sigterm处理程序优雅地杀死循环线程时退出主线程?

时间:2018-08-04 03:56:22

标签: python multithreading sigterm

我编写了Python代码,让多个线程使用队列中的消息。线程应该一直运行,直到收到sigterm信号为止。因此,我正在使用信号处理程序将全局标志设置为True,这将使线程退出其循环。

exit_flag = False

def sleep_ten():
    while True:
        print('Begin Sleeping {}'.format(threading.currentThread))
        time.sleep(10)
        print('End Sleeping {}'.format(threading.currentThread))
        if exit_flag:
            break
    print('Thread exits {}'.format(threading.currentThread))

def sigterm_handler(sig, frame):
    print('Term signal received')
    global exit_flag
    exit_flag = True
    sys.exit()

if __name__ == '__main__':
    for i in range(2):
        t = threading.Thread(target=sleep_ten, name='worker-%s' % i)
        t.start()

    while True:
        signal.signal(signal.SIGTERM, sigterm_handler)
        signal.signal(signal.SIGINT, sigterm_handler)
        print('Waiting')
        time.sleep(5)

根据类似帖子Why is signal.SIGTERM not dealt with properly in my main thread?的回答,信号处理程序中的sys.eixt()是退出主线程的必备条件。

当我运行代码并使用命令kill -9 [pid]杀死进程时,主线程确实被杀死。子线程也是如此。目的是在发出终止信号后不立即终止线程。

我尝试setDaemon是。它没有帮助

0 个答案:

没有答案