Python threading.Condition.wait()未捕获SIGTERM

Python threading.Condition.wait()未捕获SIGTERM,python,multithreading,conditional-statements,wait,Python,Multithreading,Conditional Statements,Wait,我有以下代码,执行时等待被SIGINT、SIGTERM或SIGQUIT中断。初始化对象时,它会创建一个threading.Condition()和acquireds()it!然后,程序注册信号处理程序,当接收到上述信号时,调用notify()和release()。注册信号处理程序后,它会调用条件变量和块上的wait() 当我试图用Ctrl-C停止程序时,它没有响应。照此,未调用\u signal\u handler()方法 # start from signal import signal,

我有以下代码,执行时等待被
SIGINT
SIGTERM
SIGQUIT
中断。初始化对象时,它会创建一个
threading.Condition()
acquireds()
it!然后,程序注册信号处理程序,当接收到上述信号时,调用
notify()
release()
。注册信号处理程序后,它会调用条件变量和块上的
wait()

当我试图用
Ctrl-C
停止程序时,它没有响应。照此,未调用
\u signal\u handler()
方法

# start

from signal import signal, SIGINT, SIGTERM, SIGQUIT
from threading import Condition

class A:
    def __init__(self):
        self._termination_signal = Condition()
        self._termination_signal.acquire(blocking=0)

    def _signal_handler(self, signum, frame):
        print "Received terminate request - signal = {0}".format(signum)
        del frame
        self._termination_signal.notify()
        self._termination_signal.release()
        return

    def register_and_wait(self):
        signal(SIGINT, self._signal_handler)
        signal(SIGTERM, self._signal_handler)
        signal(SIGQUIT, self._signal_handler)
        print "Waiting to be interrupted!"
        self._termination_signal.wait()      # control blocks here!
        print "Notified!!"

def main():
    a = A()
    a.register_and_wait()

if __name__ == "__main__":
    main()

# end

我做错了什么

它似乎挂在信号处理程序中,试图获取条件变量的锁。我不知道为什么,但另一个选择就是等待信号

from signal import pause, signal, SIGINT, SIGTERM, SIGQUIT

class A:
    def __init__(self):
        self._signum = 0

    def _signal_handler(self, signum, frame):
        print "Received terminate request - signal = {0}".format(signum)
        self._signum = signum
        return

    def wait_for_signal(self):
        signal(SIGINT, self._signal_handler)
        signal(SIGTERM, self._signal_handler)
        signal(SIGQUIT, self._signal_handler)
        print "Pause until signaled"
        while self._signum == 0:
            pause()

def main():
    a = A()
    a.wait_for_signal()

main()

检查
self.\u signum
的原因是为了防止另一个信号唤醒
pause()
。一个简单的例子是
SIGALRM

signal.pause()
仅适用于Unix,最好使用一些短睡眠方法,如
time.sleep(1.0)
threading.Condition.wait(1.0)
用于可移植性。@Tey'此问题的目的是避免使用
threading.Condition.wait
,因为它会导致此死锁场景,即使在使用超时调用时也是如此。