我写了一个网络爬虫,希望能够通过键盘停下来。我不希望程序在我中断时死掉;它需要先将数据刷新到磁盘。我也不想捕获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