私には2種類のタスクがあります:Type1-いくつかの優先度の高い小さなタスク。 Type2-優先度の低い大量のタスク。
最初はデフォルトのルーティングを使用した単純な構成でしたが、ルーティングキーは使用されませんでした。それは十分ではありませんでした-時々すべての労働者がType2タスクで忙しかったので、タスク1は遅れました。ルーティングキーを追加しました:
CELERY_DEFAULT_QUEUE = "default"
CELERY_QUEUES = {
"default": {
"binding_key": "task.#",
},
"highs": {
"binding_key": "starter.#",
},
}
CELERY_DEFAULT_EXCHANGE = "tasks"
CELERY_DEFAULT_EXCHANGE_TYPE = "topic"
CELERY_DEFAULT_ROUTING_KEY = "task.default"
CELERY_ROUTES = {
"search.starter.start": {
"queue": "highs",
"routing_key": "starter.starter",
},
}
つまり、優先度の高いタスクと低いタスクの2つのキューがあります。
問題は-異なる同時実行設定で2つのセロリを開始する方法?
以前はセロリがデーモンモードで使用されていたため( これに応じて )、開始は/etc/init.d/celeryd start
が必要でしたが、今はキューと同時実行性が異なる2つのセロリを実行する必要があります。どうすればできますか?
答えのようです-celery-multi-現在、十分に文書化されていません。
私が必要とすることは、次のコマンドで行うことができます:
celeryd-multi start 2 -Q:1 default -Q:2 starters -c:1 5 -c:2 3 --loglevel=INFO --pidfile=/var/run/celery/${USER}%n.pid --logfile=/var/log/celeryd.${USER}%n.log
私たちがしていることは、異なる並行性-c:1 5 -c:2 3で異なるキュー(-Q:1がデフォルト、Q:2がスターター)をリッスンしている2つのワーカーを開始することです。
上記の回答に基づいて、次の/ etc/default/celerydファイルを作成しました(元は、ここのドキュメントで説明されている構成に基づいています: http://ask.github.com/celery/cookbook/daemonizing.html )これは、同じマシンで2つのセロリワーカーを実行する場合に機能し、各ワーカーは異なるキューにサービスを提供します(この場合、キュー名は「デフォルト」と「重要」です)。
基本的にこの回答は、前の回答を拡張したものであり、同じことを行う方法を示しているだけですが、デーモンモードのセロリについてのものです。ここではDjango-celeryを使用していることに注意してください。
CELERYD_NODES="w1 w2"
# Where to chdir at start.
CELERYD_CHDIR="/home/peedee/projects/myproject/myproject"
# Python interpreter from environment.
#ENV_PYTHON="$CELERYD_CHDIR/env/bin/python"
ENV_PYTHON="/home/peedee/projects/myproject/myproject-env/bin/python"
# How to call "manage.py celeryd_multi"
CELERYD_MULTI="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryd_multi"
# How to call "manage.py celeryctl"
CELERYCTL="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryctl"
# Extra arguments to celeryd
# Longest task: 10 hrs (as of writing this, the UpdateQuanitites task takes 5.5 hrs)
CELERYD_OPTS="-Q:w1 default -c:w1 2 -Q:w2 important -c:w2 2 --time-limit=36000 -E"
# Name of the celery config module.
CELERY_CONFIG_MODULE="celeryconfig"
# %n will be replaced with the nodename.
CELERYD_LOG_FILE="/var/log/celery/celeryd.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
# Name of the projects settings module.
export Django_SETTINGS_MODULE="settings"
# celerycam configuration
CELERYEV_CAM="djcelery.snapshot.Camera"
CELERYEV="$ENV_PYTHON $CELERYD_CHDIR/manage.py celerycam"
CELERYEV_LOG_FILE="/var/log/celery/celerycam.log"
# Where to chdir at start.
CELERYBEAT_CHDIR="/home/peedee/projects/cottonon/cottonon"
# Path to celerybeat
CELERYBEAT="$ENV_PYTHON $CELERYBEAT_CHDIR/manage.py celerybeat"
# Extra arguments to celerybeat. This is a file that will get
# created for scheduled tasks. It's generated automatically
# when Celerybeat starts.
CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule"
# Log level. Can be one of DEBUG, INFO, WARNING, ERROR or CRITICAL.
CELERYBEAT_LOG_LEVEL="INFO"
# Log file locations
CELERYBEAT_LOGFILE="/var/log/celerybeat.log"
CELERYBEAT_PIDFILE="/var/run/celerybeat.pid"
もう1つの方法は、-n
引数を使用して、ワーカープロセスに一意の名前を付けることです。
同じ物理ハードウェアで2つのPyramidアプリを実行しており、それぞれに独自のセロリインスタンス(独自のvirtualenv内)があります。
どちらも、スーパーバイザーが両方を制御し、どちらも独自のsupervisord.confファイルを使用しています。
app1:
[program:celery]
autorestart=true
command=%(here)s/../bin/celery worker -n ${Host}.app1--app=app1.queue -l debug
directory=%(here)s
[2013-12-27 10:36:24,084: WARNING/MainProcess] [email protected] ready.
app2:
[program:celery]
autorestart=true
command=%(here)s/../bin/celery worker -n ${Host}.app2 --app=app2.queue -l debug
directory=%(here)s
[2013-12-27 10:35:20,037: WARNING/MainProcess] [email protected] ready.
アップデート:
Celery 4.xでは、以下が正しく機能します。
celery multi start 2 -Q:1 celery -Q:2 starters -A $proj_name
または、インスタンスの名前を指定する場合は、次のことができます。
celery multi start name1 name2 -Q:name1 celery -Q:name2 queue_name -A $proj_name
ただし、celery multi
を使用すると、これらのインスタンスを起動するためのスクリプトショートカットにしか見えないため、画面に詳細ログが出力されないことがわかりました。
これらのインスタンスを1つずつ手動で開始する場合、異なるノード名を指定することでも機能すると思いますが、少し時間の無駄ですが-A
は同じ$proj_name
です。
ところで、 公式ドキュメント によると、次の方法ですべてのセロリワーカーを殺すことができます。
ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9