キーボードで停止できるようにしたいWebクローラーを作成しました。プログラムを中断したときにプログラムが停止することは望ましくありません。最初にデータをディスクにフラッシュする必要があります。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
プロセスは完全に終了します。なぜこれが起こるのですか?割り込みがシステムコールに影響を与えるのを防ぐ方法はありますか?