Celery を Django Web アプリケーションで使用して、オフライン タスクを管理します。これらのタスクの一部は、最大 120 秒実行できます。
コードを変更するたびに、Celery を再起動して、新しい 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 を送信する: これにより、Celery はウォーム シャットダウンを実行してから再起動することで、「再起動」を試みました。これには時間がかかるだけでなく、機能しません。古いプロセスが終了する前に新しいプロセスが起動するように見えるため、新しいプロセスは文句
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)
を言ってすぐに終了します。(これはセロリ自体のバグのようです。私は彼らに知らせました。) - SIGTERM をメイン プロセスに送信し、すぐに新しいインスタンスを起動する: Pidfile と同じ問題。
- Pidfile を完全に無効にする: Pidfile がないと、30 の Celery プロセスのどれが、ウォーム シャットダウンを実行するときに SIGTERM を送信する必要があるメイン プロセスであるかを知る方法がありません。また、メイン プロセスがまだ生きているかどうかを確認する信頼できる方法もありません。