Из Выполнение обработчиков сигналов Python :
Долгосрочный расчет, реализованный исключительно на C (например, регулярное соответствие выражений на большом тексте), может работать без прерывания в течение произвольного промежутка времени, независимо от полученных сигналов. Обработчики сигналов Python будут вызываться, когда расчет завершается.
Это может быть причиной вашей проблемы. Из-за этого ограничения ( и другие ) обработчики сигналов, написанные на Python, редко ведут себя так, как ожидалось, за исключением простейших программ.
Если вам действительно нужно немедленно поймать сигнал, вы можете необходимо написать оболочку для вашей программы на языке низкого уровня (например, C), который вызывает ваш код Python.
def signal_handler(signal, frame):
print('\n')
sys.exit(0)
def main():
signal.signal(signal.SIGINT, signal_handler)
do_stuff_before_python_terminates()
Ваш do_stuff_before_python_terminates()
не называется должным образом (по моему опыту с сигналами и python как минимум).
Сделайте вызов do_stuff_before_python_terminates()
в вашей функции sigterm
и / или sigint
.
def do_stuff_before_python_terminates():
save_variables_in_mysql()
do_this_and_that()...
def sigterm(x, y):
do_stuff_before_python_terminates()
raise Exception()
def sigint(signal, frame):
do_stuff_before_python_terminates()
raise Exception()
Убедитесь, что функция do_stuff
установлена выше сигммера & amp; sigint.