【问题标题】:How to timeout function in python, timeout less than a second如何在python中超时功能,超时不到一秒
【发布时间】:2012-08-07 17:39:41
【问题描述】:

问题说明:

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

问题:

  • re.match,我正在使用,是 Python 的函数,正如我在 StackOverflow 上的某处发现的那样(真的很抱歉,我现在找不到链接 :-()。非常运行 Python 的库时很难中断线程。因此,线程不在游戏中。
  • 因为re.match函数的评估时间相对较短,我想用这个函数分析大量的行,我需要一些不会花费太长时间执行的超时函数(这使得线程更少合适,初始化新线程需要很长时间)并且可以设置为不到一秒。
    由于这些原因,请在此处回答 - Timeout on a function call 在这里 - Timeout function if it takes too long to finish 和装饰器(警报 - 1 秒及以上)不在讨论范围内。

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

【问题讨论】:

  • 不要使用问题帖来回答您自己的问题。相反,请将您的解决方案放入下面的答案帖子中。
  • 是的。从“解决方案”开始,到处寻找自己的答案。
  • 啊,这正是我所需要的import:stackoverflow.com/questions/46290045

标签: python regex function timeout


【解决方案1】:

解决方案:

我刚刚修改了此处发布的脚本:Timeout function if it takes too long to finish。

这里是代码:

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 而不是警报解决了这个问题——我现在可以设置浮动时间——我认为当我用完整的语法发布它并引用那个答案时会更清楚。我不是故意窃取某人的信用。 :-)
  • 啊,这就是区别,而且确实更重要。
  • @Jendas:我希望你能解决这个问题,除非在你接受答案之前。它们很少是你想要的。
  • 根据signal 文档,这是行不通的:“尽管就 Python 用户而言,Python 信号处理程序是异步调用的,但它们只能发生在Python 解释器。这意味着在纯 C 中实现的长时间计算期间到达的信号(例如对大量文本的正则表达式匹配)可能会延迟任意时间。”
猜你喜欢
  • 2017-03-03
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多