函数返回时停止 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)" />中停止提交表单