13

セロリを使った分散ジョブ実行システムを実装したいと思います。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台のマシンを使用します。しかし、私のハードウェアはかなり限られているので、これは私にはうまくいきません。

何か提案をお願いします。

4

2 に答える 2

21

Celery Redisトランスポートは優先度フィールドを尊重しますが、Redis自体には優先度の概念がありません。

優先度のサポートは、キューごとにn個のリストを作成し、BRPOPコマンドでその順序を使用することによって実装されます。ここで言うnのは、優先度レベルが10(0〜9)であっても、リソースを節約するために、これらはデフォルトで4つのレベルに統合されているためです。これは、という名前のキューceleryが実際には4つのキューに分割されることを意味します。

['celery0', 'celery3`, `celery6`, `celery9`]

より優先度の高いレベルが必要な場合は、priority_stepsトランスポートオプションを設定できます。

BROKER_TRANSPORT_OPTIONS = {
    'priority_steps': list(range(10)),
}

とは言うものの、これはサーバーレベルで実装された優先順位ほど良くなることはなく、せいぜい概算である可能性があることに注意してください。ただし、それでもアプリケーションには十分な場合があります。

于 2013-03-06T11:55:45.550 に答える
2

redisメッセージの優先度に関するCeleryのドキュメントは、 redis-message-prioritiesにあります。優先度レベルをカスタマイズできます。たとえば、10を使用します。

  1. priority_stepsトランスポートオプションを設定します
app.conf.broker_transport_options = {
    'priority_steps': list(range(10)),
    'queue_order_strategy': 'priority',
}
  1. 通常の方法でセロリ労働者を開始します
celery -A tasks worker --loglevel=info
  1. タスクの呼び出し、0が最高の優先度、9が最低の優先度
custom_priority=5 
task.apply_async(args=[arg1, arg2], kwargs={'kwarg1': 'x', 'kwarg2': 'y'},priority=custom_priority)
于 2020-12-14T09:52:49.057 に答える