问题的规格:
我在寻找通过日志文件的行真正伟大的量,我分发这些线组,以正则表达式(RegExses)我已经使用存储re.match()
函数。 不幸的是我的一些RegExses的过于复杂和Python有时会自己回溯地狱。 由于这一点,我需要以某种超时来保护它。
问题:
-
re.match
,我使用的,是Python的功能,当我发现这里的某个地方在计算器上(我真的很抱歉,我无法找到该链接现在:-()。这是非常困难的中断线程与运行Python的库。为此线程退出游戏。 - 由于评估
re.match
功能需要相对短的时间,我想这个功能行大量的分析,我需要wont't花费太长的时间来执行(这使得线程甚至不太适合一些超时功能,它需要很长的时间初始化新的线程),并可以设定为小于一秒 。
由于这些原因,答案在这里- 超时的函数调用 ,并在这里- 超时功能,如果时间过长,完成与装饰(报警- 1秒以上)是假表。
我花了今天上午寻找解决这个问题,但我没有发现任何满意的答复。
解:
最终,该解决方案并不复杂,但我想,这对于其他一些无可救药的堆叠男人喜欢我在这里发表这个简单的解决方案可能是有用的。
我只是有点修改脚本张贴在这里: 超时功能,如果时间过长完成 。
这里是代码:
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
我希望,这将是有帮助的人:-)