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

问题的规格:

我正在搜索日志文件中非常多的行,并将这些行分配到组中,以便使用该re.match()函数存储的正则表达式(RegExses)。不幸的是,我的某些RegExses太复杂了,Python有时会让自己陷入困境。因此,我需要使用某种超时保护它。


问题:

re.match我正在使用的是Python的函数,正如我在StackOverflow上的某处所发现的(非常抱歉,我现在找不到链接:-()。运行Python的库中断线程非常困难。因此线程不在游戏中。

因为re.match函数的评估需要相对较短的时间,并且我想用此函数分析大量的行,所以我需要一些超时函数来执行,而该函数不会花费太长时间(这使线程更不适合,初始化花费了很长时间。新线程),并且可以设置为少于一秒。

出于这些原因,此处的答案是- 函数调用超时 ,此处- 如果装饰器所需的时间过长(警报-1秒及以上),则超时函数不在表中。

我今天上午一直在寻找这个问题的解决方案,但没有找到满意的答案。


炎炎设计
浏览 650回答 2
2回答

互换的青春

解:我刚刚修改了一个发布在这里的脚本:超时功能,如果需要太长时间才能完成。这是代码:from functools import wrapsimport errnoimport osimport signalclass TimeoutError(Exception):    passdef 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:       passtry:    begin = time.time()    loop()except TimeoutError, e:    print "Time elapsed: {:.3f}s".format(time.time() - begin)哪些印刷品Time elapsed: 0.010s

慕村9548890

使用setitimer而不是警报解决了这个问题-现在可以将时间设置为浮动-而且我认为以完整的语法发布它并参考该答案会更加清楚。我不是要窃取某人的信誉。:-)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python