Как python обрабатывает KeyboardInterrupt в течение бесконечного l oop? - PullRequest
0 голосов
/ 04 мая 2020

Когда я запускаю этот код:

while 1:
    try:
        pass
    except KeyboardInterrupt:
        pass

и нажимаю ctrl+c, чтобы попытаться завершить программу через KeyboardInterrupt, я обычно, но не всегда успешно. Большую часть времени моя первая попытка ctrl+c завершает программу, но иногда мне нужно дважды нажать ctrl+c.

Сравните это с этим кодом:

from time import sleep

while 1:
    try:
        sleep(0.000000000000000000000000000000000000000000000000000000000000000000001)
    except KeyboardInterrupt:
        pass

С этот код, независимо от того, сколько раз я нажимаю ctrl+c, программа никогда не завершается.

Я предполагаю, что в первом сценарии мой KeyboardInterrupt обычно работает, потому что операторы pass выполняются так быстро, что я более вероятно нажать ctrl+c во время проверки состояния l oop (которой нет в блоке try), чем во время выполнения инструкции pass (которая находится в блоке try).

И в Во втором примере я предполагаю, что функция сна должна выполняться намного дольше, чем проверка условия while l oop, так что я почти гарантированно нажму ctrl+c во время ее выполнения (таким образом перехватывая KeyboardInterrupt в блоке try и продолжая l oop).

Кто-нибудь может подтвердить мое предположение или дать альтернативное обоснование?

1 Ответ

0 голосов
/ 04 мая 2020

Поскольку вы pass используете прерывание клавиатуры в обоих случаях, программа просто продолжает выполнение с while l oop.

Во втором случае, из-за sleep в теле блока try, существует более высокий шанс того, что вы KeyboardInterrupt попадете в процесс во время этого sleep - что означает, что вы Блок except почти гарантированно будет выполнен. Это означает, что ваша программа просто продолжает. Вы можете проверить это, добавив отпечаток в блоке except.

from time import sleep

while 1:
    try:
        sleep(0.000000000000000000000000000000000000000000000000000000000000000000001)
    except KeyboardInterrupt:
        print('exc')
        pass

Если я запускаю это и нажимаю Ctrl+C, я получаю:

>python so_test.py
exc
exc
exc
exc
exc
exc
exc
exc

С каждым Ctrl+C блок except выполнен, но ваша программа продолжается.

В первом первом случае, однако, из-за отсутствия какой-либо задержки (т.е. sleep) в блоке try программы с такой же вероятностью будут выполняться вне блока try (до введите его или после), когда KeyboardInterrupt попадет в ваш процесс. Это означает, что ваше исключение не обрабатывается, и это завершает программу. Однако, если прерывание попадает в процесс внутри try -блока, программа продолжится. Проверьте это:

while 1:
    try:
        pass
    except KeyboardInterrupt:
        print('exc')
        pass

И вы можете получить это:

>python so_test.py
exc
exc
exc
exc
Traceback (most recent call last):
  File "so_test.py", line 5, in <module>
    pass
KeyboardInterrupt

Надежда, которая прояснит путаницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...