У меня есть программа на 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 Я так не думаю. Внешний цикл for только печатает информацию, в то время как внутренний цикл for подготавливает выполнение, извлекая некоторую информацию из Интернета и из файла и настраивая некоторые классы. Наконец, цикл while - это то место, где выполнение длится долго.
Что ж, я думаю, ваш пример не совсем подходит для вашей ситуации, так как я смог сломать его во внутреннем цикле. Вы должны попытаться привести более представительный пример, иначе вам будет сложно здесь помочь.
Я нашел этот пример gist.github.com/camilin87/8571791, и он хорошо работает. Однако грациозно это не останавливается ...






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