最初にいくつかのプロパティの必要性 (または不必要性) を定義したい場合があります。
- スクリプトの失敗に対する回復力
- 必要に応じてロック (単一インスタンス スクリプト)
- 管理のしやすさ
- 依存関係に従う可能性 (A は B の前に実行する必要があります)
- 手動介入なしでブート時に起動する機能
- バックグラウンド プロセスによるインタラクティブなパフォーマンスの枯渇なし
これらを考慮して、私は通常、次のスキームを使用します。
- n 秒ごとにワーカー スクリプトを実行する単一の OS レベルのスケジューラ ティックを作成します (Cron、Windows スケジューラなど)。これが唯一のプラットフォーム固有の部分になります
- OS レベルのスケジューラが粗すぎる場合は、ラッパー スクリプトをスケジュールします。このスクリプトは、
usleep()
OS レベルの粒度に達するまで、によってスケジュールされたワーカー スクリプトを数回開始します。
- ワーカー スクリプト内では、最初にブックキーピングを行います。フラグファイルを書き込むか、存在する場合は、ストールしたワーカー デッドロックをチェックし、エラーを警告する可能性があります。
- その後、サイクルを開始します。
- 1 つの作業項目をデキューし (依存関係とシーケンスはここに入る)、開始済みとしてマークする
- 終了したら、フラグファイルを強制終了して終了します
かなりの数のポーリングのみのワークロードに対して、このアプローチで良い結果が得られました。
編集
1つ忘れました:並列処理が必要な場合は、並列可能な作業項目を同時に開始するだけです