python中断一个命令,如果它花费的时间比它应该的长

2024-04-20 09:06:07 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
Timeout on a Python function call
How to timeout function in python, timout less than a second

我在for循环中运行一个函数,例如:

for element in my_list:
    my_function(element)

由于某些原因,某些元素可能会导致函数的处理时间非常长(甚至可能是一些我无法真正跟踪其来源的无限循环)。所以我想添加一些循环控制,以跳过当前元素,如果它的处理时间超过2秒。如何做到这一点?在


Tags: to函数in元素foronmy时间
2条回答

像这样:

import signal
import time

class Timeout(Exception): 
    pass 

def try_one(func,t):
    def timeout_handler(signum, frame):
        raise Timeout()

    old_handler = signal.signal(signal.SIGALRM, timeout_handler) 
    signal.alarm(t) # triger alarm in 3 seconds

    try: 
        t1=time.clock()
        func()
        t2=time.clock()

    except Timeout:
        print('{} timed out after {} seconds'.format(func.__name__,t))
        return None
    finally:
        signal.signal(signal.SIGALRM, old_handler) 

    signal.alarm(0)
    return t2-t1

def troublesome():
    while True:
        pass

try_one(troublesome,2)

函数troublsome永远不会单独返回。如果您使用try_one(troublesome,2),它将在2秒后成功超时。在

我不赞成最明显的答案-使用信号报警()以及异步引发异常以跳出任务执行的警报信号处理程序。理论上,它应该工作得很好,但实际上cPython解释器代码不能保证处理程序在您想要的时间范围内执行。信号处理可能会延迟x个字节码指令,因此在显式取消警报后(在try块的上下文之外)仍可能引发异常。在

我们经常遇到的一个问题是,在可超时代码完成后,会引发报警处理程序的异常。在

由于没有太多可用的线程控制方式,我一直依赖进程控制来处理必须超时的任务。基本上,要点是将任务交给子进程,如果任务花费太长时间,则终止子进程。multiprocessing.pool不是很复杂,所以我有一个用于该级别控制的home-rolled池。在

相关问题 更多 >