Python空闲和KeyboardInterrupts

css*_*drx 11 python python-idle

Idle中的KeyboardInterrupts 90%的时间都在为我工作,但我想知道他们为什么不总是工作.在空闲时,如果我这样做

import time
time.sleep(10)
Run Code Online (Sandbox Code Playgroud)

然后使用Ctrl + C尝试使用KeyboardInterrupt,直到睡眠10秒后才会中断该过程.

相同的代码和通过Ctrl + C的KeyboardInterrupt立即在shell中工作.

Jer*_*own 8

快速浏览IDLE源会发现KeyboardInterrupts有一些特殊的案例处理:http://svn.python.org/view/python/tags/r267/Lib/idlelib/PyShell.py?annotate=88851

最重要的是,代码实际上是在一个单独的进程中执行的,主要的IDLE gui进程通过RPC进行通信.您将在该模型下获得不同的行为 - 最好只使用规范的解释器进行测试(通过命令行,交互式等)

============

深层发掘...

RPC服务器上的套接字在辅助线程中管理,该线程应该使用对thread.interrupt_main()的调用来传播KeyboardInterrupt(http://svn.python.org/view/python/tags/r267/Lib/idlelib /run.py?annotate=88851).行为不是那里预期的......这篇帖子暗示,由于某种原因,interrupt_main不提供你期望的粒度级别:http://bytes.com/topic/python/answers/38386-thread-interrupt_main -doesnt,似乎工作

由于解释器循环的处理方式,cPython中的异步API函数有点傻(根据我的经验),因此我并不感到惊讶.interrupt_main()调用PyErr_SetInterrupt()以异步方式通知解释器在主线程中处理SIGINT.来自http://docs.python.org/c-api/exceptions.html#PyErr_SetInterrupt:

此函数模拟SIGINT信号到达的效果 - 下次调用PyErr_CheckSignals()时,将引发KeyboardInterrupt

这将要求解释器在再次调用PyErr_CheckSignals()之前通过任意数量的字节码指令 - 这可能在time.sleep()期间不会发生.我冒昧地说这是模拟SIGINT而不是实际发出SIGINT信号的瑕疵.