您必须定期检查未决信号,例如,在模拟循环的第N次迭代中:
from cpython.exc cimport PyErr_CheckSignals
cdef Run(self):
while True:
# do some work
PyErr_CheckSignals()
PyErr_CheckSignals
将运行与信号模块一起安装的信号处理程序(KeyboardInterrupt
必要时包括升高)。
PyErr_CheckSignals
速度非常快,可以经常调用它。请注意,应该从主线程调用它,因为Python在主线程中运行信号处理程序。从辅助线程调用它无效。
由于信号是在不可预测的时间异步传递的,因此直接从信号处理程序运行任何有意义的代码是有问题的。因此,Python将传入的信号排队。稍后将其作为解释器循环的一部分进行处理。
如果您的代码已完全编译,则解释器循环将永远不会执行,并且Python没有机会检查和运行排队的信号处理程序。