2013-04-22 89 views
7

Pythonでウォッチドッグタイマーを実装する方法は?私は2つのユースケースとPythonでシンプルなウォッチドッグタイマを実装したいと思い

  • ウォッチドッグ機能は、ウォッチドッグは、特定の定期実行機能が実際に実行しないことを保証しますx
  • より長いを実行していないことを保証します少なくともすべてy

どうすればよいですか?あなたが定期的に何かを実行し、したい場合は

watchdog = Watchdog(x) 
try: 
    # do something that might take too long 
except Watchdog: 
    # handle watchdog error 
watchdog.stop() 

使用法:あなたは機能未満x秒で終了したことを確認したい場合に使用

from threading import Timer 

class Watchdog: 
    def __init__(self, timeout, userHandler=None): # timeout in seconds 
     self.timeout = timeout 
     self.handler = userHandler if userHandler is not None else self.defaultHandler 
     self.timer = Timer(self.timeout, self.handler) 
     self.timer.start() 

    def reset(self): 
     self.timer.cancel() 
     self.timer = Timer(self.timeout, self.handler) 
     self.timer.start() 

    def stop(self): 
     self.timer.cancel() 

    def defaultHandler(self): 
     raise self 

:ちょうどこれを私自身の解決策を公開

+0

ここで '[WatchdogTimer'の実装です1つのスレッドしか作成しない](https://stackoverflow.com/a/34115590/4279) – jfs

答えて

6

少なくともy秒ごとに実行されていることを確認してください。

import sys 

def myHandler(): 
    print "Whoa! Watchdog expired. Holy heavens!" 
    sys.exit() 

watchdog = Watchdog(y, myHandler) 

def doSomethingRegularly(): 
    # make sure you do not return in here or call watchdog.reset() before returning 
    watchdog.reset() 
+0

PEP8について聞いたことがありますか?ここでは 'Timer()'とは何ですか? –

+0

いいえ、それについて聞いたことはありません。私は初心者です。しかし、私は一度私はこのためにもっと時間があることを確認します... –

+1

私はあなたの 'reset'メソッドについてはわかりません。あなたの '__init__'では、' userHandler'(これは 'not is not BTW 'でなければならない)に基づいて' Timer'が切り替わります。 'reset'では、常に' self.handler'が使用されます。 –

1

まあ、私は 'ウォッチドッグタイマー'を望んでいたスレッドを中断する方法を見つけられませんでした。この例は私にとってはうまくいきません。 実行中

import time 
if __name__ == '__main__': 
    Watchdog(1) 
    try: 
     while True: 
      print 'Tiempo' 
      time.sleep(0.1) 
    except Watchdog: 
     print 'Error' 

いいえ何も起こりません...中断はありません。

私は 'self.timer.start()'という行を追加しましたが、例外が発生しましたが、私のメインスレッドは中断しません。 Ctrl + Cを押していない限り、「print 'Error' '」という行は実行されません。

1

signal.alarm()はあなたのプログラムのためのタイムアウトを設定し、あなたのメインループでそれを呼び出すと、あなたが容認する用意がある2倍の大きいに設定することができます

import signal 
while True: 
    signal.alarm(10) 
    infloop() 
+0

これはUnix上でのみ動作すると思います – andy

関連する問題