python,3秒后打破功能

时间:2011-07-11 18:14:09

标签: python

有时,我的功能会挂起。如果功能超过3秒。 我想退出这个功能,怎么做?

由于

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)

我可以使用select module设置输入超时 您应该能够正确设置输入类型。

i,o,e = select.select([sys.stdin],[],[],5)

这将在继续之前监听输入5秒钟。