Python: завершение вложенных циклов с помощью Ctrl + c

У меня есть программа на Python с вложенными циклами for и while. Я уже читал здесь об использовании KeyboardInterrupt и здесь об использовании SIGINT.

Я реализовал блок try-catch внутри каждого цикла с сообщением и действием в except. Действительно, я пробовал с явным выходом через sys.exit(), с break и с raise, выбрасывая исключения, чтобы поймать их во внешнем цикле.

Все решения не работают, и Ctrl + c улавливается только внешним циклом, внутренние циклы не улавливают его, т.е. даже если я нажимаю много раз Ctrl + c, полная итерация внутреннего for и несколько итераций while выполняются до того, как сломаться.

Пример кода

import signal
signal.signal(signal.SIGINT, signal.default_int_handler)
for i in range(0,M):
    try:
        # do something
        for j in range(0,N):
            try:
                # do something
                while(P > 0):
                    try:
                        P-=1
                        # do something
                    except KeyboardInterrupt:
                        print("while loop exiting via Ctrl+c")
                        sys.exit(1) # break or raise
            except KeyboardInterrupt:
                print("inner foor loop exiting via Ctrl+c")
                sys.exit(1) # break or raise
    except KeyboardInterrupt:
        print("outer for loop exiting via Ctrl+c")
        sys.exit(1) # break or raise

У вас есть какие-либо предложения?

Редактировать: Я забыл сказать, что цикл while находится внутри функции, вызываемой внутренним циклом for. Не думаю, что это проблема.

Я добавил несколько засыпаний в ваш код, чтобы замедлить его, и мне удалось разорвать внутренний цикл. Может у вас проблема с синхронизацией?

toti08 07.08.2018 09:38

@ toti08 Я так не думаю. Внешний цикл for только печатает информацию, в то время как внутренний цикл for подготавливает выполнение, извлекая некоторую информацию из Интернета и из файла и настраивая некоторые классы. Наконец, цикл while - это то место, где выполнение длится долго.

erotavlas 07.08.2018 09:47

Что ж, я думаю, ваш пример не совсем подходит для вашей ситуации, так как я смог сломать его во внутреннем цикле. Вы должны попытаться привести более представительный пример, иначе вам будет сложно здесь помочь.

toti08 07.08.2018 09:49

Я нашел этот пример gist.github.com/camilin87/8571791, и он хорошо работает. Однако грациозно это не останавливается ...

erotavlas 14.08.2018 17:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
306
0

Другие вопросы по теме