擅长:python、mysql、java
<p>下面是一个上下文管理器,它为<code>SIGINT</code>附加一个信号处理程序。如果调用了上下文管理器的信号处理程序,则只有在上下文管理器退出时将信号传递给原始处理程序,信号才会延迟。</p>
<pre><code>import signal
import logging
class DelayedKeyboardInterrupt(object):
def __enter__(self):
self.signal_received = False
self.old_handler = signal.signal(signal.SIGINT, self.handler)
def handler(self, sig, frame):
self.signal_received = (sig, frame)
logging.debug('SIGINT received. Delaying KeyboardInterrupt.')
def __exit__(self, type, value, traceback):
signal.signal(signal.SIGINT, self.old_handler)
if self.signal_received:
self.old_handler(*self.signal_received)
with DelayedKeyboardInterrupt():
# stuff here will not be interrupted by SIGINT
critical_code()
</code></pre>