Python関数実行タイミング
2388 ワード
Python関数計時
参考記事
threadingのtimerタイマの使用
解釈:これは実は
しんごうりょうきこう
説明:ここでは信号量メカニズムを用いてsignal.alarm(interval)に超時間間隔を設定し、signal.signal(signal.SIGALRM,handler)のhandlerはタイムアウト後にトリガーされる動作です.
直接pip install timeout、from timeout import timeout、必要な関数の前に@timeout(n)でいいです.問題:このtimeoutはサブスレッドにも使えません.使用エラー判断によって、その原理はsignalと一致するはずです.
2017.08.19
参考記事
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