키보드를 통해 멈추고 싶은 웹 크롤러를 작성했습니다. 프로그램을 중단 할 때 프로그램이 죽는 것을 원하지 않습니다. 먼저 디스크에 데이터를 플러시해야합니다. 또한 영구 데이터가 일관성이없는 상태 일 수 있으므로 KeyboardInterruptedException
을 포착하고 싶지 않습니다.시스템 콜 중에 SIGINT 잡기/차단하기
내 현재 해결 방법은 SIGINT
을 포착하고 플래그를 설정하는 신호 처리기를 정의하는 것입니다. 메인 루프의 각 반복은 다음 url을 처리하기 전에이 플래그를 검사합니다.
^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
프로세스가 완전히 종료 :
그러나, 나는 시스템이 내가 인터럽트를 보낼 때 socket.recv()
을 실행하는 일이 생기면, 나는이를 얻을 것으로 나타났습니다. 왜 이런 일이 생길까요? 인터럽트가 시스템 호출에 영향을 미치지 않도록하는 방법이 있습니까?
위대한 설명, 감사합니다. – danben
'EINTR'대신 파이썬이 제공하는 식별자가 무엇이든간에 매직 넘버 4를 사용하는 것은 매우 나쁜 습관입니다. 그것은 어떤 아치를 깨기 쉽습니다. –
물론, 당신 말이 맞아요. 파이썬 라이브러리 문서를 다시 읽었고'errno' 모듈이 이러한 상수를 제공하는 것으로 보이므로 예제를 조정할 것입니다. –