如何在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
我希望,这将有助于某人:-)