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
,因为它会导致此死锁场景,即使在使用超时调用时也是如此。