python - 当函数返回时停止 SIGALRM

标签 python python-2.7 signals

我有一个我自己似乎无法解决的问题。我正在编写一个小的 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 所在的函数退出时,我该如何继续告诉 SIGALRM 停止?

谢谢!

最佳答案

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

很可能它只是调用 libc 中的 alarm(),而 man alarmalarm(0) “...使当前警报无效,信号 SIGALRM 将不会被传送。”

关于python - 当函数返回时停止 SIGALRM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013127/

相关文章:

python - 使用扭曲矩阵的异步执行

python - 有没有一种方法可以在Python中不指定默认值参数的情况下访问可变参数

使用定时器处理 C 信号

c - LInux 信号概念

c - 程序如何处理带有多个线程和信号的中断?

python - 在 python 守护进程中使用多处理模块时出错

python - 从 Python 代码创建单个 exe 文件

Python按多个条件排序

python - 根据不同的列值将值分配给数据框中的列

python - 如何查找pandas数据框中的数据类型错误?