Как выйти из основного потока, изящно убивая циклические потоки с помощью обработчика 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 Правда. Это не помогло

0 ответов

Другие вопросы по тегам