セロリを使った分散ジョブ実行システムを実装したいと思います。rabbitMQが優先度をサポートしておらず、この機能が非常に必要であるため、celery+redisを使用しました。
私の状況では、タスクはハードウェアと密接に関連しています。たとえば、必要なハードウェアを持っているのはワーカー1のPCのみであるため、タスクAはワーカー1でのみ実行できます。各ワーカーの並行性を1に設定して、ワーカーが毎回1つのタスクのみを実行するようにしました。各タスクには約2分かかります。
優先機能を実装するために、まず、たとえばとpriority
を呼び出すときに引数を追加してみました。このテストでは、COCURRENCY = 1のワーカーを1つだけ起動し、優先度の異なる10のタスクを1つずつ開始しました。開始されたタスクが優先的に実行されることを期待していましたが、残念ながら、それらは開始順序として開始されたばかりです。apply_async()
apply_async(priority=0)
apply_async(priority=9)
apply_async(priority=0)
それから私はいくつかの回避策を試してみます。各タスクのクローンを作成したので、それぞれにtask_highとtask_lowがあり、とで装飾され@celery.task(priority=0)
て@celery.task(priority=1)
います。次に、上記と同じテストを行いましたが、今回はキックオフ順が「HH-LLLL-HHHH」の場合、実際の順序は「HH-LHHLHLLH」になります。ここで、redisがスケジューリングとバランシングの作業を行ったと思います。
しかし、これでも私の期待に応えることはできません。「HHHHHH-LLLL」のような注文を希望します。一部のタスクでは、必要なハードウェアを備えた適切なマシンが1台しかないため、優先度の高いタスクをできるだけ早く実行することを望んでいます。
インターネットで他の回避策を探しました。たとえば、2つのキューを使用し、1つは優先度の高いタスク用、もう1つは優先度の低いタスク用で、前者には2台、後者には1台のマシンを使用します。しかし、私のハードウェアはかなり限られているので、これは私にはうまくいきません。
何か提案をお願いします。