Python,三秒后中断函数

1 投票
3 回答
2634 浏览
提问于 2025-04-16 21:17

有时候,我的函数会卡住。如果这个函数运行超过3秒,我想要退出这个函数,我该怎么做呢?

谢谢

3 个回答

0

我通过使用 select模块 成功地为输入设置了一个超时时间。
你应该能够根据需要正确设置你的输入类型。

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

这段代码会在继续之前监听输入5秒钟。

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 是在调用一个外部程序,这个程序有时会卡住,我希望能够在这种情况下优雅地退出。

6

嗯,你可能需要先搞清楚为什么程序会卡住。如果它花了很长时间在某个工作上,或许你可以找到更有效率的方法来完成它。如果这个工作需要超过三秒钟,那在中间打断又有什么用呢?我们假设这个工作确实是需要完成的。

到底是哪个调用卡住了呢?如果你没有这个调用的代码,那你就没办法解决这个问题,除非你把它放到另一个线程里运行,并创建一个定时器来监控它。

这听起来像是你可能在试图回答一个错误的问题,但也许你是在等待一个连接或者某个应该有超时限制的操作。根据你提供的信息(或者说缺乏信息),我们很难判断到底是哪种情况。要不你发一些代码过来,这样我们才能给出更明确的答案?

撰写回答