如何在python中实现超时功能,超时时间小于一秒 问题的说明:

如何在python中实现超时功能,超时时间小于一秒 问题的说明:,python,regex,function,timeout,Python,Regex,Function,Timeout,我在一个日志文件中搜索了大量的行,并将这些行分配给各个组,以便使用re.match()函数存储正则表达式(regexse)。不幸的是,我的一些正则表达式太复杂了,Python有时会陷入回溯地狱。因此,我需要用某种超时来保护它 问题: 我正在使用的re.match,是Python的函数,正如我在StackOverflow上发现的(很抱歉,我现在找不到链接:-()。运行Python库很难中断线程。因此,线程已退出游戏 因为计算re.match函数需要相对较短的时间,而且我想用这个函数分析大量的行,

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

问题:
  • 我正在使用的
    re.match
    ,是Python的函数,正如我在StackOverflow上发现的(很抱歉,我现在找不到链接:-()。运行Python库很难中断线程。因此,线程已退出游戏
  • 因为计算
    re.match
    函数需要相对较短的时间,而且我想用这个函数分析大量的行,所以我需要一些不会花费太长时间来执行的超时函数(这使得线程更不合适,初始化新线程需要很长时间)和可以设置为小于1秒
    基于这些原因,答案如下: 在这里,与装饰(报警-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

不要用问题帖来回答你自己的问题。相反,把你的答案放在下面的答题帖上。是的,从“解决方案”开始向下,进入你自己的答案。啊,这正是我所需要的关于导入的这个问题:这基本上是另一个答案的完整副本,唯一的区别是你显示秒参数可以是一个浮点。是的,但是使用setitimer而不是alarm解决了这个问题-我现在可以将时间设置为浮点-我想我当我发布完整的语法并引用该答案时,它将变得更加清晰。我不是有意窃取某人的信用。:-)啊,这就是区别,这确实更重要。@Jendas:我希望你能解决这个问题,除非在你接受答案之前。它们很少是您想要的。根据
signal
文档,这是行不通的:“尽管Python信号处理程序对于Python用户来说是异步调用的,但它们只能在“原子”之间发生。”Python解释器的指令。这意味着在纯用C语言实现的长时间计算过程中到达的信号(如大型文本体上的正则表达式匹配)可能会延迟任意时间。”