私たちはDjango WebアプリケーションでCeleryを使ってオフラインタスクを管理しています。これらのタスクの中には最大120秒まで実行できます。タスクを遅らせずにセロリを正常に再起動する方法
コードを変更するたびに、新しいPythonコードをリロードするためにCeleryを再起動する必要があります。私たちの現在の解決策は、SIGTERMをメインのセロリプロセス(kill -s 15 `cat /var/run/celeryd.pid`
)に送信し、それが消滅して再起動するまで待つことです(python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]
)。
長時間実行されるタスクのため、通常シャットダウンには1〜2分かかります。その間に新しいタスクは処理されず、現在サイトにいるユーザーにはかなりの遅延が発生します。私はCeleryにシャットダウンを指示する方法を探していますが、すぐに新しいタスクを実行するために新しいCeleryインスタンスを起動します。メインプロセスにSIGHUPを送る
- :はない仕事をしたこと
物事これは暖かいシャットダウンを行うと、その後、自分自身をリニューアルによって、「再起動」を試みるようにセロリを引き起こしました。古いプロセスが始まる前に新しいプロセスが起動するので、新しいプロセスは
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)
とすぐに終了するので、これは長い時間がかかるだけでなく、動作しません。 (これはセロリ自体のバグのようです; - メインプロセスにSIGTERMを送信してすぐに新しいインスタンスを起動すると、Pidfileと同じ問題が発生します。
- Pidfileを完全に無効にする:それなしでは、30のセロリプロセスが、ウォームシャットダウンを実行するときにSIGTERMに送信する必要があるメインプロセスであることを知らせる方法がありません。また、メインプロセスがまだ生きているかどうかを確認する信頼できる方法もありません。
多分私の答えはhttp://stackoverflow.com/questions/9764913/how-do-i-restart-celery-workers-gracefully/16717128#16717128です。 – guettli