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

问题的规格:

我正在search日志文件的大量行,并将这些行分配给组,以便使用re.match()函数存储的正则expression式(RegExses)。 不幸的是,我的一些RegExses太复杂了,Python有时会让自己回溯到地狱。 由于这一点,我需要用某种超时保护它。

问题:

  • re.match ,我使用的是Python的函数,因为我在StackOverflow的某个地方发现了(我真的很抱歉,我现在找不到链接:-() 。要运行Python因为这个原因线程不在游戏中。
  • 因为re.match函数的计算时间比较短,我想用这个函数分析很多线,所以我需要一些超时函数,不需要太长的执行时间(这使得线程更不适合,需要很长的时间时间来初始化新的线程)可以设置为不到一秒钟
    由于这些原因,这里的答案 – 在函数调用 超时和在这里 – 超时函数,如果花了很长时间完成装饰(闹钟 – 1秒以上)不在桌上。

我已经花了今天上午寻找解决这个问题,但我没有find任何满意的答案。

解:

最后,解决scheme并没有那么复杂,但是我认为,对于像我这样的其他绝望的人来说,在这里发布这个简单的解决scheme可能是有用的。

我只是在这里发布了一些修改过的脚本: Timeout函数,如果它需要太长时间才能完成 。

这里是代码:

 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 

我希望,这将有助于某人:-)