我编写了一个网络爬虫,希望能够通过键盘停止。我不希望程序在我中断时死掉;它需要先将其数据刷新到磁盘。我也不想 catch 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
并且该过程完全退出。为什么会这样?有没有办法可以防止中断影响系统调用?