同じredisデータベースに異なるタスクとワーカーを含む複数のセロリキューを保持しようとしています。私のマシンに2台ではなく1台のRedisサーバーだけが必要な便利な問題です。
セロリチュートリアルのドキュメントをそのまま使用しました。今、名前/キューを少し調整してすべてを複製しようとすると、エラーが発生し続けます。
注-私はPythonおよびCelery、これは明らかに問題の一部です。どの部分が名前として "task/tasks"と特別な単語として名前が付けられているかわかりません。
要約版のドキュメント:celery = Celery('tasks', broker='redis://localhost')
と、遅延したい関数の上にある@task()
を含むタスクコードが含まれています。
タスクをキューに入れるためのプログラム内で...
celery -A tasks worker
したがって、上記のすべてを考えると、これを別々のキューとワーカーで独立して実行される2種類のタスクに変えるために必要な手順は何ですか?たとえば、blue_tasksとred_tasks?
タスクのすべてのインスタンスをblue_tasksまたはred_tasksに変更しようとしました。ただし、blue_tasksをキューに入れると、起動したred_tasksワーカーが作業を開始します。
デフォルトのキューなどについて読んだので、このコードを試しましたが、うまくいきませんでした:
from tasks import do_work
do_work.delay()
サイドノートとして、CELERY_DEFAULT_QUEUE = 'red'
CELERY_QUEUES = (
Queue('red', Exchange('red'), routing_key='red'),
)
はデフォルトのamqpインスタンスに接続しようとするセロリでcelery worker
エラーが発生する理由を理解できませんが、celery -A tasks worker
はセロリにRedisへの接続を指示します。何も指定されていない場合、ワーカーで実行しようとするcelery worker
タスクコードは何ですか?
デフォルトでは、すべてがcelery
という名前のデフォルトのキューに入ります(キューが指定されていない場合、これはcelery worker
が処理します)
do_work
にDjango_project_root/myapp/tasks.py
タスク関数があるとしましょう。
do_work
タスクは、次のように独自のキューで実行するように構成できます。
CELERY_ROUTES = {
'myproject.tasks.do_work': {'queue': 'red'},
}
次に、celery worker -Q red
を使用してワーカーを実行すると、そのキュー内のものだけが処理されます(celery worker
で呼び出された別のワーカーは、デフォルトのキュー内のもののみをピックアップします)
ドキュメントの task routing セクションですべてを説明する必要があります。
別のキューに動的にリンクするには、次の手順に従います。
1)「キュー」属性でキューの名前を指定します
celery.send_task('job1', args=[], kwargs={}, queue='queue_name_1')
celery.send_task('job1', args=[], kwargs={}, queue='queue_name_2')
(ここで、特定のジョブは2つのキューを使用します)
2)構成ファイルに次のエントリを追加します
CELERY_CREATE_MISSING_QUEUES = True
3)ワーカーの起動中に、-Qを使用して、ジョブを消費するキュー名を指定します
celery -A proj worker -l info -Q queue1
celery -A proj worker -l info -Q queue2