Как выйти из основного потока, изящно убивая циклические потоки с помощью обработчика 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)
Согласно ответу на аналогичный пост, почему signal.SIGTERM неправильно обрабатывается в моей основной ветке?, sys.eixt()
в обработчике сигналов есть необходимость для выхода из основного потока.
Когда я запустил код и использовал команду kill -9 [pid]
чтобы убить процесс, основной поток был убит. То же самое сделали и дочерние темы. Намерение состоит в том, чтобы аккуратно уничтожить потоки не сразу после сигнала уничтожения.
Я пытался setDaemon
Правда. Это не помогло