У меня есть многопоточный демон Python.Как и любой хороший демон, он хочет запустить все свои рабочие потоки, а затем подождать, пока ему не скажут завершить работу.Обычный сигнал для завершения - SIGTERM
, и в большинстве языков я бы предпочел завершить, ожидая события или мьютекса, поэтому использование threading.Event
имело смысл для меня.Проблема в том, что Event
объект Python и сигналы 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
убить обработчик сигнала?