3

私はいくつかの Twisted サーバーを作成しており、定期的に実行される WatchDog タイマーを作成しました。デフォルトの動作は、スケジュールからのデルタ時間内に呼び出されたかどうかを確認することです。これは、プログラムが過度にブロックされているかどうかを報告するのに役立ちます。また、システムの他の部分の状態をチェックするために使用できる WatchDog へのユーザー定義のコールバック関数の方法も提供します。WatchDog タイマーは twisted.internet.task.LoopingCall を使用して実装されます。ユーザー定義関数が例外を作成し、WatchDog タイマーの呼び出しが停止するかどうかが心配です。コードに例外処理がありますが、それでもクラッシュする場合は、WatchDog タイマーを再起動する方法が必要です。ただし、 LoopingCall().start() メソッドによって返される deferred の使用方法がわかりません。ここ'

import sys
from twisted.internet import reactor, defer, task
from twisted.python import log

def periodic_task():
    log.msg("periodic task running")
    x = 10 / 0

def periodic_task_crashed():
    log.msg("periodic_task broken")

log.startLogging(sys.stdout)

my_task = task.LoopingCall(periodic_task)
d = my_task.start(1)
d.addErrback(periodic_task_crashed)
reactor.run()

このコードを実行すると、periodic_task() 関数から "定期的なタスクが実行されています" というメッセージが 1 つ表示され、それだけです。my_task.start(1) によって返される deferred には、errback が呼び出されることはありません。これは、ドキュメントを読むことで、起こるはずのことです。

誰かが私を助けて、私が間違っていることを指摘できますか?

前もって感謝します!ダグ

4

1 に答える 1

3

の署名periodic_task_crashedが間違っています。これは のエラー コールバックであるため、取得したエラー結果を表す がDeferred引数で呼び出されます。引数を取らないように定義されているため、これを呼び出すと、 の新しいエラー結果となる が生成されます。FailureDeferredTypeErrorDeferred

次のように再定義します。

def periodic_task_crashed(reason):
    log.err(reason, "periodic_task broken")
于 2012-10-26T19:06:33.490 に答える