我稍微修改了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)
如何在单线程应用程序中超时后终止函数?
答案 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')
,则可以修复您的案例。