函数返回时停止 SIGALRM

Posted

技术标签:

【中文标题】函数返回时停止 SIGALRM【英文标题】:Stop SIGALRM when function returns 【发布时间】:2015-01-16 18:02:36 【问题描述】:

我有一个我自己似乎无法解决的问题。我正在编写一个小型 python 脚本,我想知道为什么我的 signal.alarm 在它所在的函数返回后仍然有效。代码如下:

class AlarmException(Exception):
    pass

def alarmHandler(signum, frame):
    raise AlarmException

def startGame():
    import signal
    signal.signal(signal.SIGALRM, alarmHandler)
    signal.alarm(5)
    try:
        # some code...
        return 1
    except AlarmException:
        # some code...
        return -1

def main():
    printHeader()
    keepPlaying = True
    while keepPlaying:
        score = 0
        for level in range(1):
            score += startGame()
        answer = raw_input('Would you like to keep playing ? (Y/N)\n')
        keepPlaying = answer in ('Y', 'y')

所以问题是当我的startGame() 函数返回时,SIGALRM 仍在倒计时并关闭我的程序。这是回溯:

Would you like to keep playing ? (Y/N)
Traceback (most recent call last):
  File "game.py", line 84, in <module>
    main()
  File "game.py", line 80, in main
    answer = raw_input('Would you like to keep playing ? (Y/N)\n')
  File "game.py", line 7, in alarmHandler
    raise AlarmException
__main__.AlarmException

当它所在的函数退出时,我该如何继续告诉 SIGALRM 停止?

谢谢!

【问题讨论】:

【参考方案1】:

当您想禁用警报时,请尝试拨打signal.alarm(0)

很可能它只是在 libc 中调用 alarm(),而 man alarm 表示 alarm(0) “...使当前警报无效,并且不会传递信号 SIGALRM。”

【讨论】:

以上是关于函数返回时停止 SIGALRM的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure 函数获取 401 时,Azure 逻辑应用停止执行

在给定的时间预算后停止函数调用[重复]

当函数返回false时如何在strut2 <sx:submit onClick="return myfunction(a, b)" />中停止提交表单

AWS lambda 函数在超时错误后停止工作

如何停止返回导致“void函数中出现意外的非void返回值”?

停止表单提交的 JavaScript 代码