【发布时间】:2013-09-02 21:46:45
【问题描述】:
我正在尝试限制函数在 python (flask) 中运行的时间。它看起来像这样:
def my_function:
try:
long_function_time()
catch TimeOutException:
return "Function took too long to execute"
def long_function_time:
#stuff here
我最初尝试使用信号,但被告知这不是一个好方法,因为烧瓶在线程环境中运行。我希望最大执行时间灵活,以便我可以轻松更改它。
我目前使用的代码(有时不起作用,不知道为什么):
class TimedOutExc(Exception):
pass
def deadline(timeout, *args):
def decorate(f):
def handler(signum, frame):
signal.alarm(0)
raise TimedOutExc()
def new_f(*args):
signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout)
return f(*args)
new_f.__name__ = f.__name__
return new_f
return decorate
提前致谢!
【问题讨论】:
-
在this question 中有许多不同的解决方法可以中断长 Python 函数。
-
@Miguel:他们中的大多数似乎都使用信号?
-
您可能会发现this blog post 和各种cmets 很有趣。基本上,您尝试做的并不是一个容易解决的问题。您最好将长时间运行的代码分解成更小的块(也许使长期运行的函数成为生成器函数)。然后,在每个处理块之后测试超时。或者,重新评估您实际尝试做的事情;也许这个长时间运行的过程应该使用像 Celery 这样的异步任务队列库来完成。
-
这在我的情况下是不可能的@Mark。你不能分叉线程然后在 x 秒后杀死它吗?如果我知道足够多的 python,我可以自己尝试。
-
典型的经验法则是“永远不要从外部杀死线程”。这在理论上听起来不错,但在实践中,它最终会带来更多的麻烦而不是它的价值(资源没有正确分配)。