gpt4 book ai didi

python - 在 python 中终止程序

转载 作者:太空宇宙 更新时间:2023-11-03 16:45:44 24 4
gpt4 key购买 nike

您好,我在 python 代码中嵌入了时间限制,该代码正在运行带有函数的 fortran 代码。但是我意识到对其他函数施加时间限制的函数不会终止代码,只是将其留在后台并跳过它。我想要做的是当代码超过限制时间时终止它。这是我用来限制时间的代码,取自 here .

def timeout(func, args=(), kwargs={}, timeout_duration=15, default=1):
import signal

class TimeoutError(Exception):
pass

def handler(signum, frame):
raise TimeoutError()

# set the timeout handler
signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout_duration)
try:
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
finally:
signal.alarm(0)

return result

我查找了 popen.terminate()sys.exit()atexit.register() 但无法弄清楚它将如何与我尝试在评论中显示的下面部分添加的这段代码一起使用。

...
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
#add the terminator
finally:
...

注意:函数位于 for 循环链内,因此我不想终止整个 python session ,而只想终止该函数运行的程序(即 fortran 代码)并跳到 for 循环链中的另一个元素。

在一些评论和答案后添加以下部分:

我尝试使用 popen.terminate() 添加 SIGTERM,但是它终止了所有 python session ,我只想终止当前正在运行的 session 并跳到 for 循环中的其他元素。我所做的如下:

...
signal.signal(signal.SIGTERM, handler)
signal.alarm(timeout_duration)
try:
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
popen.terminate()
...

最佳答案

您不能期望引发异常的信号处理程序通过调用堆栈传播,它是在不同的上下文中调用的。

popen.terminate() 将在 posix 系统上生成 SIGTERM,因此您应该有一个 SIGTERM 的信号处理程序,而不是 SIGALRM .

您应该设置一些定期检查以停止事件的变量,而不是在信号处理程序中引发异常。

或者,如果您没有 SIGTERM 的信号处理程序,则默认处理程序可能会生成 KeyboardInterrupt 异常。

关于python - 在 python 中终止程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36323629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com