如何在python中实现超时函数,超时时间小于一秒
- 2025-03-21 09:06:00
- admin 原创
- 33
问题描述:
问题说明:
我正在搜索日志文件的大量行,并将这些行分发到组中,以便使用该re.match()
函数存储正则表达式 (RegExses)。不幸的是,我的一些 RegExses 太复杂了,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
解决方案 2:
我们可以这样定义超时 slow_function 函数,但即使引发异常后它也不会停止 slow_function:
import threading, time
class TimeoutError(Exception):
pass
def slow_function():
time.sleep(1000)
return "Done"
def run_with_timeout(func, timeout):
def target():
nonlocal result
result = func()
result = None
thread = threading.Thread(target=target)
thread.start()
thread.join(timeout)
if thread.is_alive():
raise TimeoutError("Function timed out")
return result
try:
result = run_with_timeout(slow_function, 3)
except TimeoutError:
print("Function timed out")
else:
print("Function returned:", result)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD