web-dev-qa-db-ja.com

セロリワーカーを正常に再起動するにはどうすればよいですか?

ワーカーのコードを更新するために新しいビルドを発行しているときに、セロリワーカーを正常に再起動するにはどうすればよいですか?

編集:私がやろうとしているのは、このようなことです。

  • ワーカーは実行中です。おそらく100 MBのファイルをS3にアップロードしています
  • 新しいビルドが来る
  • ワーカーコードに変更があります
  • ビルドスクリプトがワーカーに信号を送信します
  • 新しいコードで新しいワーカーを開始します
  • 既存のジョブの終了を完了した後に信号を受け取ったワーカー。
40
Quintin Par

ワーカーを再起動するための新しい推奨される方法は、ここに記載されています http://docs.celeryproject.org/en/latest/userguide/workers.html#restarting-the-worker

$ celery multi start 1 -A proj -l info -c4 --pidfile=/var/run/celery/%n.pid
$ celery multi restart 1 --pidfile=/var/run/celery/%n.pid

http://ask.github.com/celery/userguide/workers.html#restarting-the-worker に従って、HUPシグナルを送信しているワーカーを再起動できます。

 ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | xargs kill -HUP
45
armonge
celery multi start 1 -A proj -l info -c4 --pidfile=/var/run/celery/%n.pid
celery multi restart 1 --pidfile=/var/run/celery/%n.pid

http://docs.celeryproject.org/en/latest/userguide/workers.html#restarting-the-worker

11
zengr

killルートを使用している場合は、pgrepが助けになります。

kill -9 `pgrep -f celeryd`

念のため、これは長時間実行されるタスクではなく、残酷に終了するかどうかは気にしません。開発中に新しいコードをリロードするだけです。より敏感な場合は、再起動サービスルートに行きます。

4
JL Peyret

Celeryの autoreloading を見てください

3
sebasmagri

自動スクリプトを使用して-HUPソリューションを繰り返しテストしましたが、約5%の時間で、ワーカーは再起動後に新しいジョブの取得を停止します。

より信頼性の高いソリューションは次のとおりです。

stop <celery_service>
start <celery_service>

これは何百回も問題なく使用しています。

Python内から、次を実行できます。

import subprocess
service_name = 'celery_service'
for command in ['stop', 'start']:
    subprocess.check_call(command + ' ' + service_name, Shell=True)
2
crunk_monad

できるよ:

celery multi restart w1 -A your_project -l info#ワーカーの再起動 リンクの説明をここに入力

1
cảnh nguyễn

長時間実行されているタスクはどうなりますか?私はこの方法が好きです:長時間実行されるタスクは自分の仕事をするべきです。それらを中断しないでください。新しいタスクのみが新しいコードを取得する必要があります。

ただし、現時点ではこれは不可能です。 https://groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ

1
guettli