我有一个线程化的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"
Run Code Online (Sandbox Code Playgroud)
但这导致没有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"
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
threading.Event在某种程度上滥用了吗?threading.Event杀死信号处理程序?