signal.alarm没有按时触发异常

时间:2016-01-19 13:53:03

标签: python timeout signals

我稍微修改了official docs(页面底部)的信号示例。

我正在呼叫sleep 10,但我希望在1秒后发出警报。当我运行以下代码片段时,需要超过1秒才能触发异常(我认为它会运行整整10秒)。

import signal, os

def handler(signum, frame):
    print 'Interrupted', signum
    raise IOError("Should after 1 second")

signal.signal(signal.SIGALRM, handler)
signal.alarm(1)

os.system('sleep 10')

signal.alarm(0)

如何在单线程应用程序中超时后终止函数?

1 个答案:

答案 0 :(得分:4)

来自the docs

  

Python信号处理程序不会在低级(C)内执行   信号处理器。相反,低级信号处理程序设置标志   它告诉虚拟机执行相应的Python   稍后的信号处理程序(例如在下一个字节码处)   指令)。

因此,在某些情况下,诸如signal.alarm()生成的信号在超时后不能终止函数。 the function should cooperate by allowing other Python code to run (e.g., by calling PyErr_CheckSignals() periodically in C code)或您use a separate process, to terminate the function in time

如果您使用subprocess.check_call('sleep 10'.split())代替os.system('sleep 10'),则可以修复您的案例。