0

プロセスをスケジュールしようとしています。実行したい日時を含むテーブルに保存しています。

これにアプローチする方法がわかりません。ユーザーが作成したプロセスごとにエントリを作成する必要がありますか、それとも単一のエントリを作成する必要がありますか?実行して実行しますか?

編集: 各アプローチの長所と短所、およびタスク スケジューリングを扱ったことのある人からのガイダンスを探しています。また、プラットフォームに依存しないようにしたいのですが、それは必須ではありません。現在、Linuxマシンで作業しています。

4

2 に答える 2

1

最初にいくつかのプロパティの必要性 (または不必要性) を定義したい場合があります。

  • スクリプトの失敗に対する回復力
  • 必要に応じてロック (単一インスタンス スクリプト)
  • 管理のしやすさ
  • 依存関係に従う可能性 (A は B の前に実行する必要があります)
  • 手動介入なしでブート時に起動する機能
  • バックグラウンド プロセスによるインタラクティブなパフォーマンスの枯渇なし

これらを考慮して、私は通常、次のスキームを使用します。

  • n 秒ごとにワーカー スクリプトを実行する単一の OS レベルのスケジューラ ティックを作成します (Cron、Windows スケジューラなど)。これが唯一のプラットフォーム固有の部分になります
  • OS レベルのスケジューラが粗すぎる場合は、ラッパー スクリプトをスケジュールします。このスクリプトは、usleep()OS レベルの粒度に達するまで、によってスケジュールされたワーカー スクリプトを数回開始します。
  • ワーカー スクリプト内では、最初にブックキーピングを行います。フラグファイルを書き込むか、存在する場合は、ストールしたワーカー デッドロックをチェックし、エラーを警告する可能性があります。
  • その後、サイクルを開始します。
    • 1 つの作業項目をデキューし (依存関係とシーケンスはここに入る)、開始済みとしてマークする
    • この作業項目を実行し、完了としてマークします
    • フラグファイルを更新して進行状況を表示します
  • 終了したら、フラグファイルを強制終了して終了します

かなりの数のポーリングのみのワークロードに対して、このアプローチで良い結果が得られました。

編集

1つ忘れました:並列処理が必要な場合は、並列可能な作業項目を同時に開始するだけです

于 2013-07-31T00:44:50.840 に答える
0

ユーザーが作成したプロセスごとにエントリを作成する必要があると思います。そのため、「重い」ジョブはそのために作成されたcronによって実行されます。さらに、他のアプローチでは、ユーザーが作成したプロセスがスケジュールどおりに実行されるように、十分に短い期間 DB をチェックするスクリプトを実行する必要があります。

于 2013-07-31T00:34:54.710 に答える