gpt4 book ai didi

Python:使用 Signal.Alarm 进行超时异常处理

转载 作者:行者123 更新时间:2023-11-28 16:34:26 28 4
gpt4 key购买 nike

如果函数调用时间过长,我正在尝试实现超时异常处理程序。

编辑:事实上,我正在使用子进程编写 Python 脚本,它调用带参数的旧 C++ 程序。我知道该程序有时会挂起,不返回任何内容。这就是为什么我试图设定一个时间限制并继续使用不同参数等进行下一次调用。

我一直在寻找并尝试实现它,但它不太奏效,所以我希望得到一些帮助。到目前为止我所拥有的是:

#! /usr/bin/env python

import signal

class TimeOutException(Exception):
def __init__(self, message, errors):
super(TimeOutException, self).__init__(message)
self.errors = errors

def signal_handler(signum, frame):
raise TimeOutException("Timeout!")

signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(3)

try:
while True:
pass

except TimeOutException:
print "Timed out!"

signal.alarm(0)

编辑:我目前收到的错误消息是“TypeError:init() 恰好需要 3 个参数(给定 2 个)

另外,我想问一个关于 except block 的基本问题。 “except TimeOutException”下面的代码和“Exception handler”中的代码有什么作用区别?似乎两者都可以做同样的事情?

如有任何帮助,我们将不胜感激。

最佳答案

if a function call is taking too long

我意识到这对于没有经验的开发人员来说可能并不明显,但是适用于解决此问题的方法完全取决于您在这个“繁忙的功能”中所做的事情,例如:

  • 这是一个繁重的计算吗?如果是,您使用的是哪个 Python 解释器? CPython 还是 PyPy?如果是 CPython:此计算是否仅使用 Python 字节码,还是涉及外包给已编译机器代码的函数调用(这可能会在相当长的一段时间内保持 Python 的全局解释器锁)?

  • 这是大量的 I/O 工作吗?如果是,您能否在任意状态下中止此 I/O 工作?还是需要适当清理?您是否使用某种框架,例如 gevent 或 Twisted?

编辑:所以,看起来你只是在生成一个子进程并等待它终止。太好了,这实际上是实现超时控制的最简单的问题之一。 Python (3) 提供了相应的功能! :-) 看看

https://docs.python.org/3/library/subprocess.html#subprocess.call

The timeout argument is passed to Popen.wait(). If the timeout expires, the child process will be killed and then waited for again. The TimeoutExpired exception will be re-raised after the child process has terminated.

编辑2:

给你的示例代码,将其保存到一个文件中并至少使用 Python 3.3 执行它:

import subprocess


try:
subprocess.call(['python', '-c', 'print("hello")'], timeout=2)
except subprocess.TimeoutExpired as e:
print("%s was terminated as of timeout. Its output was:\n%s" % (e.cmd, e.output))


try:
subprocess.call(['python'], timeout=2)
except subprocess.TimeoutExpired as e:
print("%s was terminated as of timeout. Its output was:\n%s" % (e.cmd, e.output))

在第一种情况下,子进程立即返回。不会引发超时异常。在第二种情况下,超时到期,您的控制进程(上面运行的脚本进程)将尝试终止子进程。这成功了。之后,引发 subprocess.TimeoutExpired 并由异常处理程序处理。对我来说,上面脚本的输出是 ['python'] was terminated as of timeout。它的输出是:
:

关于Python:使用 Signal.Alarm 进行超时异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28373746/

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