为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2019-12-04 12:44:46
问题的规格:我正在搜索日志文件中非常多的行,并将这些行分配到组中,以便使用该re.match()函数存储的正则表达式(RegExses)。不幸的是,我的某些RegExses太复杂了,Python有时会让自己陷入困境。因此,我需要使用某种超时保护它。问题:re.match我正在使用的是Python的函数,正如我在StackOverflow上的某处所发现的(非常抱歉,我现在找不到链接:-()。运行Python的库中断线程非常困难。因此线程不在游戏中。因为re.match函数的评估需要相对较短的时间,并且我想用此函数分析大量的行,所以我需要一些超时函数来执行,而该函数不会花费太长时间(这使线程更不适合,初始化花费了很长时间。新线程),并且可以设置为少于一秒。出于这些原因,此处的答案是- 函数调用超时 ,此处- 如果装饰器所需的时间过长(警报-1秒及以上),则超时函数不在表中。我今天上午一直在寻找这个问题的解决方案,但没有找到满意的答案。
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

解:


我刚刚修改了一个发布在这里的脚本:超时功能,如果需要太长时间才能完成。


这是代码:


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


查看完整回答
反对 回复 2019-12-04
?
慕村9548890

TA贡献1884条经验 获得超4个赞

使用setitimer而不是警报解决了这个问题-现在可以将时间设置为浮动-而且我认为以完整的语法发布它并参考该答案会更加清楚。我不是要窃取某人的信誉。:-)

查看完整回答
反对 回复 2019-12-04
  • 2 回答
  • 0 关注
  • 649 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信