Я написал веб-сканер, который я бы хотел остановить с помощью клавиатуры.Я не хочу, чтобы программа умерла, когда я ее прерываю;сначала необходимо сбросить данные на диск.Я также не хочу перехватывать KeyboardInterruptedException
, поскольку постоянные данные могут находиться в несогласованном состоянии.
Мое текущее решение состоит в том, чтобы определить обработчик сигнала, который перехватывает SIGINT
и устанавливает флаг;каждая итерация основного цикла проверяет этот флаг перед обработкой следующего URL.
Однако я обнаружил, что если система выполняет socket.recv()
при отправке прерывания, я получаю следующее:
^C
Interrupted; stopping... // indicates my interrupt handler ran
Traceback (most recent call last):
File "crawler_test.py", line 154, in <module>
main()
...
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 397, in readline
data = recv(1)
socket.error: [Errno 4] Interrupted system call
и процесс завершается полностью.Почему это происходит?Можно ли как-то предотвратить прерывание, влияющее на системный вызов?