J'ai un démon Python threadé. Comme tout bon démon, il veut lancer tous ses threads de travail, puis attendre jusqu'à ce qu'il soit dit de se terminer. Le signal normal pour la terminaison est SIGTERM
, et dans la plupart des langues je tiens à terminer en attendant un événement ou mutex, donc en utilisant threading.Event
fait sens pour moi. Le problème est que l'objet Event
de Python et les signaux Unix ne semblent pas bien jouer ensemble.Pourquoi l'utilisation de threading.Event entraîne-t-elle l'absence de capture de SIGTERM?
Cela fonctionne comme prévu, se terminant le 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"
mais les résultats ne SIGTERM
être livré (c.-à-tout à fait en dehors de cesser de fumer, "manipulé" n'est imprimé):
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"
Donc ma question est:
- Ai-je usé
threading.Event
en quelque sorte? - Si je ne le suis pas, y a-t-il une alternative autre que le mécanisme d'interrogation et de sommeil du premier exemple?
- De même si je ne le suis pas, pourquoi l'utilisation de
threading.Event
tue-t-elle le gestionnaire de signal?
Caractéristique gênante de Python, mais solution parfaite. Je vous remercie. Je dois avouer qu'il ne m'est pas venu à l'esprit de chercher des restrictions supplémentaires sur l'utilisation du «signal», puisque je savais que l'équivalent C fonctionnerait très bien. –
Cela signifie-t-il que la seule façon de gérer les signaux est de dédier le thread principal (parent) aux signaux de capture (en bloquant 'signal.pause()')? Ce que cela implique est que le fil principal ne peut plus rien faire d'utile. En d'autres termes, vous ne pouvez pas avoir de modèle maître/ouvrier (où les deux threads se parlent) mais vous avez besoin d'un modèle maître/ouvrier + ouvrier (où les deux ouvriers se parlent et le maître ne fait rien. –