Python SIGINT SIGTERM не мгновенно завершает цикл while

2
задан Human Khoo 13 July 2018 в 16:10
поделиться

3 ответа

Из Выполнение обработчиков сигналов Python :

Долгосрочный расчет, реализованный исключительно на C (например, регулярное соответствие выражений на большом тексте), может работать без прерывания в течение произвольного промежутка времени, независимо от полученных сигналов. Обработчики сигналов Python будут вызываться, когда расчет завершается.

Это может быть причиной вашей проблемы. Из-за этого ограничения ( и другие ) обработчики сигналов, написанные на Python, редко ведут себя так, как ожидалось, за исключением простейших программ.

Если вам действительно нужно немедленно поймать сигнал, вы можете необходимо написать оболочку для вашей программы на языке низкого уровня (например, C), который вызывает ваш код Python.

0
ответ дан David Cullen 17 August 2018 в 12:36
поделиться
  • 1
    спасибо, но это просто невозможно для меня. я не могу закодировать в C, и мне определенно нужно запустить python do_stuff_before_python_terminates () на каждом сигмерме или сигнете (shutdown или ctr + l). – Human Khoo 13 July 2018 в 17:13
  1. Зарегистрируйте сигнал в main (). Например:
        def signal_handler(signal, frame):
                print('\n')
                sys.exit(0)
    
        def main():
            signal.signal(signal.SIGINT, signal_handler)
            do_stuff_before_python_terminates()
    
  2. Сигналы не срабатывают до тех пор, пока не закончится низкоуровневый код C; из документации: «Долгосрочный расчет, реализованный исключительно на C (например, согласование регулярных выражений на большом тексте), может выполняться без прерывания в течение произвольного промежутка времени, независимо от полученных сигналов. Обработчики сигналов Python будут вызваны когда вычисление завершается. "
0
ответ дан gregory 17 August 2018 в 12:36
поделиться
  • 1
    в чем разница, если я зарегистрирую их глобально до того, как мой код перейдет в main ()? У меня только проблема выскочить из циклов – Human Khoo 13 July 2018 в 16:46
  • 2
    нет "глобального" - если у вас есть main (), скрипт начинается там и продолжается оттуда. – gregory 13 July 2018 в 16:57
  • 3
    мой код работает с самого начала, а затем переходит к основному в конце моего кода, где я говорю ему, за пределами любой функции, регистрирующей сиг- нантер и сигстерм-обработчик, как в моем примере кода – Human Khoo 13 July 2018 в 17:04

Ваш 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.

0
ответ дан J0hn 17 August 2018 в 12:36
поделиться
  • 1
    Это может быть правильный способ записи обработчиков сигналов, но я хотел бы понять, что не так с исходным кодом. – VPfB 13 July 2018 в 15:00
  • 2
    я добавил дополнительную информацию, спасибо за ваш ответ, я ценю это, но ваш ответ не помогает – Human Khoo 13 July 2018 в 15:09
Другие вопросы по тегам:

Похожие вопросы: