【发布时间】:2010-06-23 13:44:56
【问题描述】:
我有一个线程化的 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会杀死信号处理程序?
【问题讨论】:
标签: python events multithreading signals daemon