У меня есть поточный демон Python. Как любой хороший демон, он хочет запустить все свои рабочие потоки, а затем подождать, пока не будет объявлено о завершении. Нормальный сигнал для завершения - SIGTERM
, и на большинстве языков я бы остановился, ожидая события или мьютекса, поэтому использование threading.Event
имело смысл для меня. Проблема в том, что объекты Python Event
и сигналы Unix не отображаются хорошо вместе.
Это работает как ожидалось, заканчивая на SIGTERM
:
import signal
import time
RUN = True
def handle(a, b):
global RUN
print "handled"
RUN = False
signal.signal(signal.SIGTERM, handle)
while RUN:
time.sleep(0.250)
print "Stopping"
но это приводит к доставке SIGTERM
(т.е. не говоря уже о прекращении работы, "обработанный" никогда не печатается):
import signal
import threading
RUN_EVENT = threading.Event()
def handle(a, b):
print "handled"
RUN_EVENT.set()
signal.signal(signal.SIGTERM, handle)
RUN_EVENT.wait()
print "Stopping"
Итак, мой вопрос:
- Я неправильно использую
threading.Event
? - Если это не так, есть ли альтернатива, отличная от механизма опроса и сна, из первого примера?
- Также, если это не так, почему использование
threading.Event
убивает обработчик сигнала?