Python関数実行タイミング

2388 ワード

Python関数計時
参考記事
threadingのtimerタイマの使用
    from threading import timer
    import time
    
    def time_limit(interval):
        def wraps(func):
            def time_out():
                raise RuntimeError()
    
            def deco(*args, **kwargs):
                timer = Timer(interval, time_out) # interval   ,time_out           
                timer.start()
                res = func(*args, **kwargs)
                timer.cancel()
                return res
            return deco
        return wraps
        
    @time_limit(5)
    def time_test(run_time):
        time.sleep(run_time)
        
    
    if __name__ == '__main__':
    time_test(7)
    

解釈:これは実は を走った.1つはtime_を実行することですtest()のメインスレッドで、1つはタイミングを計るためのスレッドTimer(interval,time_out)である.run_time>intervalの場合、タイムリミットに達すると、タイマプロセスは Timer ( timeout )になりますが、(この方法では、実行中に詰まっている可能性のある関数を処理できません).
しんごうりょうきこう
    # coding:utf-8
    import time
    import signal
    
    
    def time_limit(interval):
        def wraps(func):
            def handler(signum, frame):
                # print signum
                raise RuntimeError()
            def deco(*args, **kwargs):
                signal.signal(signal.SIGALRM, handler)
                signal.alarm(interval)
                res = func(*args, **kwargs)
                signal.alarm(0)
                return res
            return deco
        return wraps
    
    
    @time_limit(2)
    def time_test(time_interval):
        time.sleep(time_interval)
        print '------'
    
    
    if __name__ == '__main__':
        try:
            time_test(5)
        except RuntimeError:
            print 'stop ...'



説明:ここでは信号量メカニズムを用いてsignal.alarm(interval)に超時間間隔を設定し、signal.signal(signal.SIGALRM,handler)のhandlerはタイムアウト後にトリガーされる動作です. handler , time_test() が必要です.handlerのraiseの異常はtime_testでキャプチャできます.これによりtime_test関数を終了し、他の処理を行うことができます.問題:handler関数の2つのパラメータは必須のようです.そうしないとエラーが発生します.問題: , , signal , , @time_limit(2) time_test 。from timeout import timeoutメソッド
直接pip install timeout、from timeout import timeout、必要な関数の前に@timeout(n)でいいです.問題:このtimeoutはサブスレッドにも使えません.使用エラー判断によって、その原理はsignalと一致するはずです.
2017.08.19