有时,我的功能会挂起。如果功能超过3秒。 我想退出这个功能,怎么做?
由于
答案 0 :(得分:6)
好吧,你应该弄清楚它为什么会悬挂。如果花费很长时间来完成工作,那么也许你可以更有效地做一些事情。如果它需要超过三秒钟而不是中间打破如何帮助你?假设实际上需要完成工作。
什么电话挂了?如果您不拥有挂起的呼叫的代码,那么除非您在另一个线程上运行它并创建一个计时器来观看它。
这听起来像是trying to find an answer to the wrong question的情况,但也许你正在等待一个应该有超时期限的连接或某些操作。有了你给我们的信息(或缺乏信息),我们无法分辨出哪些是真的。如何发布一些代码,以便我们能够给出更明确的答案?
答案 1 :(得分:5)
我也必须这样做。我掀起了一个模块,它提供了一个装饰器来限制函数的运行时间:
import logging
import signal
from functools import wraps
MODULELOG = logging.getLogger(__name__)
class Timeout(Exception):
"""The timeout handler was invoked"""
def _timeouthandler(signum, frame):
"""This function is called by SIGALRM"""
MODULELOG.info('Invoking the timeout')
raise Timeout
def timeout(seconds):
"""Decorate a function to set a timeout on its execution"""
def wrap(func):
"""Wrap a timer around the given function"""
@wraps(func)
def inner(*args, **kwargs):
"""Set an execution timer, execute the wrapped function,
then clear the timer."""
MODULELOG.debug('setting an alarm for %d seconds on %s' % (seconds, func))
oldsignal = signal.signal(signal.SIGALRM, _timeouthandler)
signal.alarm(seconds)
try:
return func(*args, **kwargs)
finally:
MODULELOG.debug('clearing the timer on %s' % func)
signal.alarm(0)
signal.signal(signal.SIGALRM, oldsignal)
return inner
return wrap
我用它像:
@limits.timeout(300)
def dosomething(args): ...
在我的情况下,dosomething
正在调用外部程序,该程序会定期挂起,我希望能够在发生这种情况时干净地退出。
答案 2 :(得分:0)