【问题标题】:signal.alarm not triggering exception on timesignal.alarm 未按时触发异常
【发布时间】:2016-04-25 00:49:20
【问题描述】:

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

我正在致电sleep 10,但我希望在 1 秒后发出警报。当我运行以下 sn-p 时,触发异常需要超过 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)

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

【问题讨论】:

  • 您对系统sleep 的调用不会暂停所有内容,包括信号计时器吗?闹钟没有响,因为它也睡着了。您可能必须使用 subprocess 模块将 sleep 调用推送到单独的进程中。

标签: python timeout signals


【解决方案1】:

来自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'),则可以解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2019-04-21
    • 2019-07-10
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多