擅长:python、mysql、java
<p>你所看到的行为是由于两个因素的相互作用:</p>
<p>(1)当您调用<code>signal.alarm</code>时,您将清除所有以前的报警;在调用之后,只会安排最近请求的报警。在</p>
<p>(2)捕获到的信号终止<code>time.sleep</code>,并导致睡眠中断;在信号处理程序返回后,它不会恢复。在</p>
<p>现在,当您向您的进程发送<code>SIGINT</code>时,它通常在睡眠期间到达,它会中断,因此在处理程序<code>ctlc_catcher</code>返回{<cd5>}循环后,立即继续到下一个迭代,从该点调度一秒的新警报并清除所有旧警报。换句话说,如果<code>SIGINT</code>在循环的一次迭代期间到达,那么这个迭代几乎永远不会以一秒钟的睡眠结束,因此循环的下一次迭代将执行并在有机会传递之前清除已经计划好的警报。在</p>
<p>由此可知,如果您按cntl-C的频率超过每秒一次,则根本看不到<code>"Got an alarm."</code>。在</p>
<p>如果您想保证在任何中断的情况下每秒发送一次警报,那么您必须做一些额外的工作,以决定在每次循环迭代中是否应该安排警报。在</p>