Ich habe einen Web-Crawler geschrieben, den ich gerne über die Tastatur anhalten könnte. Ich möchte nicht, dass das Programm stirbt, wenn ich es unterbreche; Es muss zuerst seine Daten auf der Festplatte löschen. Ich möchte auch nicht KeyboardInterruptedException
fangen, weil die persistenten Daten in einem inkonsistenten Zustand sein könnten.SIGINT während des Systemaufrufs abfangen/blockieren
Meine aktuelle Lösung besteht darin, einen Signalhandler zu definieren, der SIGINT
abfängt und ein Flag setzt; Jede Iteration der Hauptschleife prüft dieses Flag vor der Verarbeitung der nächsten URL.
Allerdings habe ich festgestellt, dass, wenn das System socket.recv()
Ausführung werden passiert, wenn ich den Interrupt senden, erhalte ich dieses:
^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
und der Prozess verlässt vollständig. Warum passiert das? Kann ich verhindern, dass der Interrupt den Systemaufruf beeinflusst?
Große Erklärung, danke. – danben
Die Verwendung der magischen Zahl 4 anstelle von 'EINTR' oder welcher Bezeichner Python dafür bereitstellt, ist eine sehr schlechte Übung. Es wird wahrscheinlich einige Bögen brechen. –
Sicher hast du recht. Ich lese die Python-Bibliotheksdokumente noch einmal und es scheint, dass das 'errno'-Modul diese Konstanten bereitstellt, so dass ich das Beispiel anpassen werde. –