擅长:python、mysql、java
<p>您必须定期检查挂起的信号,例如,在模拟循环的每N次迭代中:</p>
<pre><code>from cpython.exc cimport PyErr_CheckSignals
cdef Run(self):
while True:
# do some work
PyErr_CheckSignals()
</code></pre>
<p><code>PyErr_CheckSignals</code>将运行与<a href="http://docs.python.org/2/library/signal.html" rel="noreferrer">signal</a>模块一起安装的信号处理程序(这包括在必要时引发<code>KeyboardInterrupt</code>)。在</p>
<p><code>PyErr_CheckSignals</code>速度很快,经常打电话也没关系。注意,应该从主线程调用它,因为Python在主线程中运行信号处理程序。从工作线程调用它没有效果。在</p>
<p><strong>说明</strong></p>
<p>由于信号是在不可预知的时间异步传递的,因此直接从信号处理程序运行任何有意义的代码都是有问题的。因此,Python对传入的信号进行排队。队列稍后作为解释器循环的一部分进行处理。在</p>
<p>如果代码被完全编译,解释器循环就永远不会执行,Python就没有机会检查和运行排队的信号处理程序。在</p>