web-dev-qa-db-ja.com

年中無休で稼働する個人のスケジュールマネージャーはどのように設計すればよいですか?

複数の習慣を一度に変えようとする [〜#〜] adhd [〜#〜] 自分用の管理システムを開発しました。これが従来の知恵に反することは知っていますが、私は何年にもわたって従来の方法を試してきました。 (実際の質問から人々の注意をそらさないようにしてそれを防ぐために言いたかっただけです)

とにかく、私を監視したり、特定の習慣を身につけたり、回避したりするのに役立つリモートサーバー上で実行するものを書きたいと思います。

これは、次のようなシステムです。

  • 年中無休
  • 一度に実行する複数の独立したタスクがあるかもしれません
  • 最初に実行する他のタスクを必要とするタスクがあるかもしれません
  • 特定の時間、繰り返し(「5分ごとに実行」)、または間隔(「午後2時から午後3時まで実行」)でタスクをスケジュールできる

これに対する私の最初の素朴な試みは、単一のPHPスクリプトが毎分cronによって実行されるようにスケジュールされた(特定のライブラリを使用するために言語が選択されましたが、もはや必要ありません)だけでした。これを実行するか、コードのその部分を実行すると、かなり速くなります。

だから私の質問は、ここからこれにどのように取り組むべきですか?私はpython/javascriptに部分的に関わっていますが、1つの言語に縛られていません。

考え:

  • ロジックのビットごとに1つのスクリプトを使用したスケジューリングメカニズムを含むスクリプトのセットとして実行することもできますが、この考えは私には間違っていると感じています。

  • デーモンとして構築することは役立つかもしれませんが、現在の時刻を検出するために何十ものif-elseステートメントについて何をすべきかまだわかりません

6

私はこのようにそれについて行きます:

  1. すべてのTaskは独自のクラスにカプセル化されます
    • タスクには単一のメソッドExecuteのみが含まれます。このメソッドは、タスクのアクションを実行します。
    • タスクは、その要件のチェックを担当していません。
  2. スケジュールはJobsを介して行われます
    • ジョブがタスクを参照する
    • ジョブは、タスクの実行をいつ許可するかを定義します
    • ジョブタイプごとに1つのクラス、つまり、
      • a RecurringJob( "5分ごと")
      • IntervalJob( "午後2時から午後3時まで")
    • ジョブは Tester/Doerパターン の実装です。
  3. Job Registryが作成されます。基本的には、ジョブを実行するスケジューラです。
    • 登録されたすべてのジョブが実行可能かどうかを定期的にチェックします(10秒ごと、毎分、または必要なものすべて)。

要件「最初に実行する他のタスクを必要とするタスクがあるかもしれません」Compositeパターン を使用して実装できます=と正しい順序でタスクを渡します。

要件「一度に実行する複数の独立したタスクがある可能性がある」は、タスクの実行を非同期にすることで実装できます。

10
Daniel Hilgarth