5

重複の可能性:
Python 関数呼び出しの
タイムアウト

次のような for ループ内で関数を実行しています。

for element in my_list:
    my_function(element)

何らかの理由で、一部の要素が関数の処理時間を非常に長くする可能性があります (おそらく、どこから来たのかを実際に追跡できない無限ループでさえあります)。したがって、たとえば処理に2秒以上かかる場合、現在の要素をスキップするループ制御を追加したいと考えています。これはどのように行うことができますか?

4

2 に答える 2

1

このようなもの:

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 秒後にタイムアウトします。

于 2013-02-01T17:46:25.787 に答える