关于regex:如何在python中超时,超时时间小于1秒

How to timeout function in python, timeout less than a second

问题说明:

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

问题:

  • 我正在使用的EDOCX1[1]是python的函数,正如我在stackoverflow上发现的那样(很抱歉,我现在找不到链接:—()。运行python的库很难中断线程。因此,线程不在游戏中。
  • 因为评估re.match函数花费的时间相对较短,我想用这个函数分析大量的行,所以我需要一些执行时间不太长的超时函数(这使得线程更不合适,初始化新线程需要很长的时间),并且可以设置为小于一秒钟。出于这些原因,请在此处回答-函数调用超时如果用decorator(alarm-1sec等等)完成时间太长,那么here-timeout函数就不可用了。

今天上午我一直在寻找这个问题的解决办法,但没有找到任何令人满意的答案。


解决方案:

在"解决方案相比,不是这是复杂的,但我想,这是有用的,它可能会对一些其他人喜欢我hopelessly堆叠后这两个简单的解决方案是在这里。

在VC是一位在这里发布修改脚本超时功能:如果它需要太长的两个表面。

和这里的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

然后你可以使用这样的信息:

1
2
3
4
5
6
7
8
9
10
11
12
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)

这是我的照片

1
Time elapsed: 0.010s

希望,这将有益于人的:-)