我编写了一个网络爬虫,希望能够通过键盘停止它。我不想在中断时使程序终止;它需要先将数据刷新到磁盘上。同时,我也不想捕获KeyboardInterruptedException异常,因为持久数据可能处于不一致状态。
我的当前解决方案是定义一个信号处理程序来捕获SIGINT,并设置一个标志;每次主循环迭代处理下一个url之前都会检查这个标志。
然而,我发现如果系统在我发送中断时恰好正在执行socket.recv(),则会出现以下情况:
我的当前解决方案是定义一个信号处理程序来捕获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
进程完全退出了。为什么会这样?我能否防止中断影响系统调用?
EINTR
或Python提供的任何标识符是非常糟糕的做法。这很可能会在某些架构上出现错误。 - R.. GitHub STOP HELPING ICEerrno
模块提供了这些常量,所以我会调整示例。 - Tamás