0

いくつかの主要なステップで進行する大きなタスクがあります。ステップBを開始する前に、ステップAを完了する必要があります。ただし、私の場合、を使用して、各主要ステップを複数のプロセスに分割できますDelayed::Job

質問:すべてのプロセスがステップAでの作業を完了した後にのみ、ステップBを開始するための簡単な手法はありますか?

注1:スピンアップされた外部ワーカーの数が事前にわからないため、完了したワーカーの参照カウントを維持しても役に立ちません。

注2:他のジョブが完了するのを忙しく待つことだけが仕事であるワーカーを作成したくありません。Herokuの労働者はお金がかかります!

注3:各ワーカーにコールバックのDelayed :: Jobキューを調べて、afterそれがステップAで作業している最後のキューであるかどうかを判断することを検討しました。この場合、ステップBを開始できます。これは機能する可能性がありますが、問題が発生する可能性があります。落とし穴。(より良い答えがない場合、これは私が行っているアプローチです。)

4

1 に答える 1

0

実行内容にもよると思いますが、ステップ A のジョブが最初に実行されるように優先度を設定できます。仕様によっては、それで十分かもしれません。githubページから:

デフォルトでは、すべてのジョブが優先度 = 0 (最優先) でスケジュールされます。これは、Delayed::Worker.default_priority を別のものに設定することで変更できます。数字が小さいほど優先度が高くなります。

したがって、ステップ A を優先度 = 0 で実行するように設定し、ステップ B を優先度 = 100 で実行するように設定した場合、ステップ A が完了するまでステップ B は何も実行されません。

これが問題になる場合があります。特に、ジョブが多く、ワーカーも多数実行している場合、ステップ A の作業が完了する前にステップ B を実行しているワーカーが存在する可能性があります。理想的には、このセットアップでは、ステップ B に、実行できるかどうかを確認するための何らかのチェックがあります。

于 2012-07-05T19:55:25.063 に答える