def signal_name(signum):
try:
if sys.version_info[:2] >= (3, 5):
return signal.Signals(signum).name
else:
return _signames[signum]
except KeyError:
return 'SIG_UNKNOWN'
except ValueError:
return 'SIG_UNKNOWN'
python类Signals()的实例源码
def sigterm_handler(signum, frame):
logging.warning('Received {}, will terminate soon after finishing current job.'.format(signal.Signals(signum).name))
task_queue.interrupted = True
def wait(self):
'''
Wait for a single signal from the signal set to arrive.
'''
if not self.watching:
async with self:
return await self.wait()
while True:
if self.pending:
return signal.Signals(self.pending.popleft())
await _sigwait(self)
def signal_exception_handler(signum: int, frame) -> None:
"""Raise an exception with error message for an interruption by signal."""
raise ProgramError("program received " + signal.Signals(signum).name)
def stop_running(self, signum, frame):
print("Stopping execution due to a {} signal".format(signal.Signals(signum).name))
self.running = False
def handle_sig(self, signum):
self.running = False
work_logger.info('pid=%d, got signal: %s, stopping...', os.getpid(), Signals(signum).name)
signal.signal(SIG_PROXY, signal.SIG_IGN)
self._set_force_handler()
def handle_sig_force(self, signum, frame):
work_logger.warning('pid=%d, got signal: %s again, forcing exit', os.getpid(), Signals(signum).name)
raise ImmediateExit('force exit')
def handle_sig(self, signum, frame):
signal.signal(signal.SIGINT, self.handle_sig_force)
signal.signal(signal.SIGTERM, self.handle_sig_force)
ctrl_logger.info('got signal: %s, waiting for worker pid=%s to finish...', Signals(signum).name,
self.process and self.process.pid)
# sleep to make sure worker.handle_sig above has executed if it's going to and detached handle_proxy_signal
time.sleep(0.01)
if self.process and self.process.is_alive():
ctrl_logger.debug("sending custom shutdown signal to worker in case it didn't receive the signal")
os.kill(self.process.pid, SIG_PROXY)
def handle_sig_force(self, signum, frame):
ctrl_logger.warning('got signal: %s again, forcing exit', Signals(signum).name)
if self.process and self.process.is_alive():
ctrl_logger.error('sending worker %d SIGTERM', self.process.pid)
os.kill(self.process.pid, signal.SIGTERM)
raise ImmediateExit('force exit')