我寫了一個網絡爬蟲,希望能夠通過鍵盤停下來。我不希望程序在我中斷時死掉;它需要先將數據刷新到磁盤。我也不想捕獲KeyboardInterruptedException
,因爲持久數據可能處於不一致的狀態。在系統調用期間捕獲/阻止SIGINT
我目前的解決方案是定義一個信號處理程序,捕獲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
和過程完全退出。爲什麼會發生?有沒有辦法阻止中斷影響系統調用?
很好的解釋,謝謝。 – danben 2010-06-10 19:11:12
使用幻數4代替'EINTR'或Python提供的任何標識符是非常糟糕的做法。它很可能在某些拱門上打破。 – 2013-03-25 15:39:28
當然,你是對的。我再次閱讀Python庫文檔,似乎'errno'模塊提供了這些常量,所以我將調整示例。 – 2013-03-25 19:07:53