def do_stuff_before_python_terminates():
save_variables_in_mysql()
do_this_and_that()...
def main():
do stuff
while loops ect...
def sigterm(x, y):
raise Exception()
def sigint(signal, frame):
raise Exception()
signal.signal(signal.SIGINT, sigint)
signal.signal(signal.SIGTERM, sigterm)
try:
while True:
main()
except Exception as e:
logger.error("Exception")
do_stuff_before_python_terminates()
logger.log("sys.exit")
sys.exit(0)
Я использую Python в контейнере Docker.
Когда я делаю ctrl+c через терминал tty или останавливаю изображение, Python останавливается и делает это не всегда успешно "do_stuff_before_python_terminates()".
Причина в том, что когда python случайно находится в цикле while, мне не повезло, он не выходит, он остается в цикле while и выполняет другие действия и не завершается успешно.
Docker ждет только 10 секунд, прежде чем убьет контейнер, и, вуаля, он не «do_stuff_before_python_terminates()»
что я здесь делаю неправильно, как решить проблему, что даже когда он находится в цикле while, он мгновенно выходит и "do_stuff_before_python_terminates()"
Обновленное объяснение:
если python выдает ошибку
он успешно переходит к
except Exception as e:
logger.error("Exception")
do_stuff_before_python_terminates()
logger.log("sys.exit")
sys.exit(0)
если я остановлю контейнер или использую ctrl+c, а python НЕ находится в цикле while
он успешно переходит к
sigterm() or sigint() -> then raise an Exception() -> then jumps to
except Exception as e:
logger.error("Exception")
do_stuff_before_python_terminates()
logger.log("sys.exit")
sys.exit(0)
если я остановлю контейнер или использую ctrl+c, а python находится в цикле
it does stay in the loop
do stuff
do stuff
do stuff
after nearly 20-30seconds
sigterm() or sigint() -> then raise an Exception() -> then jumps to
except Exception as e:
logger.error("Exception")
do_stuff_before_python_terminates()
logger.log("sys.exit")
sys.exit(0)
что мне нужно, так это то, что он мгновенно выпрыгивает из цикла while всякий раз, когда я останавливаю контейнер или нажимаю ctrl+c (sigterm + sigint)
sigterm() or sigint() -> then raise an Exception() -> then jumps to
except Exception as e:
logger.error("Exception")
do_stuff_before_python_terminates()
logger.log("sys.exit")
sys.exit(0)
Docker убивает контейнер через 10 секунд, поэтому у python есть только 10 секунд для выхода, эффект заключается в том, что он никогда не делает do_stuff_before_python_terminates(), когда python находится в цикле
main()
, устанавливает свой собственный обработчик сигналов, или код, вызванный из main, перехватываетException
. - person VPfB   schedule 13.07.2018except:
илиexcept Exception
где-либо еще в вашем коде? Любой из них может перехватить сгенерированное сигналом исключение до того, как оно достигнет обработчика, выполняющегоdo_stuff_before_python_terminates()
. - person jasonharper   schedule 13.07.2018Exception
. Все вашиexcept
должны использовать максимально конкретное имя исключения, чтобы они не перехватывали то, что не должны. - person jasonharper   schedule 13.07.2018