如何在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有时会陷入回溯地狱。因此,我需要用某种超时来保护它
问题:
- 我正在使用的
,是Python的函数,正如我在StackOverflow上发现的(很抱歉,我现在找不到链接:-()。运行Python库很难中断线程。因此,线程已退出游戏re.match
- 因为计算
函数需要相对较短的时间,而且我想用这个函数分析大量的行,所以我需要一些不会花费太长时间来执行的超时函数(这使得线程更不合适,初始化新线程需要很长时间)和可以设置为小于1秒re.match
基于这些原因,答案如下: 在这里,与装饰(报警-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语言实现的长时间计算过程中到达的信号(如大型文本体上的正则表达式匹配)可能会延迟任意时间。”