Napisałem robota sieciowego, który chciałbym móc zatrzymać za pomocą klawiatury. Nie chcę, żeby program umarł, kiedy mu przerywam; najpierw musi przepłukać swoje dane na dysk. Nie chcę również złapać KeyboardInterruptedException
, ponieważ trwałe dane mogą być niespójne.Catching/blocking SIGINT podczas wywołania systemowego
Moje obecne rozwiązanie to zdefiniowanie procedury obsługi sygnału, która przechwyci SIGINT
i ustawi flagę; każda iteracja pętli głównej sprawdza tę flagę przed przetworzeniem następnego adresu URL.
jednak odkryłem, że jeśli system dzieje się wykonywanie socket.recv()
kiedy wysłać przerwanie, mam to:
^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
i proces wychodzi całkowicie. Dlaczego to się dzieje? Czy istnieje sposób, aby zapobiec zakłóceniom wpływającym na wywołanie systemowe?
Świetne wyjaśnienie, dziękuję. – danben
Używanie magicznej liczby 4 w miejsce 'EINTR' lub innego identyfikatora, który zapewnia Python, jest bardzo złą praktyką. Prawdopodobnie złamie niektóre łuki. –
Jasne, masz rację. Po raz kolejny czytałem dokumenty z biblioteki Pythona i wygląda na to, że moduł 'errno' zapewnia te stałe, więc dostosuję przykład. –