如何在python中超时函数,超时不到一秒

时间:2012-08-10 12:06:54

标签: python regex function timeout

问题规范:

我正在搜索日志文件的大量行,并且我将这些行分发到组,以便使用re.match()函数存储正则表达式(RegExses)。不幸的是,我的一些RegExses太复杂了,Python有时会让自己回归地狱。因此,我需要通过某种超时来保护它。

问题:

  • re.match,我正在使用,是Python的功能,正如我在StackOverflow 上找到的那样(我很抱歉,我现在找不到链接:-()
  • 因为评估re.match函数的时间相对较短,我想用这个函数分析大量的行,我需要一些超时函数,不需要太长时间来执行(这会使线程更不合适,初始化新线程需要很长时间)可以设置为不到一秒
    出于这些原因,答案在这里 - Timeout on a function call 而这里 - Timeout function if it takes too long to finish与装饰者(闹钟 - 1秒甚至更多)不在桌面上。

今天早上我花了很多时间寻找这个问题的解决方案,但我没有找到任何满意的答案。

1 个答案:

答案 0 :(得分:33)

<强>解决方案:

最后,解决方案并不复杂,但我想,对于像我这样的其他绝望堆积的人来说,在这里发布这个简单的解决方案可能会有用。

我在这里发布了一些经过修改的脚本:Timeout function if it takes too long to finish

以下是代码:

from functools import wraps
import errno
import os
import signal

class TimeoutError(Exception):
    pass

def timeout(seconds=10, error_message=os.strerror(errno.ETIME)):
    def decorator(func):
        def _handle_timeout(signum, frame):
            raise TimeoutError(error_message)

        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, _handle_timeout)
            signal.setitimer(signal.ITIMER_REAL,seconds) #used timer instead of alarm
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result
        return wraps(func)(wrapper)
    return decorator

然后你可以像这样使用它:

from timeout import timeout 
from time import time

@timeout(0.01)
def loop():
    while True:
       pass
try:
    begin = time.time()
    loop()
except TimeoutError, e:
    print "Time elapsed: {:.3f}s".format(time.time() - begin)

打印

Time elapsed: 0.010s

我希望,这对某人有用: - )