CeleryをDjango webappで使用してオフラインタスクを管理します。これらのタスクの一部は、最大120秒実行できます。
コードを変更するたびに、Celeryを再起動して、新しいPythonコードをリロードする必要があります。現在の解決策は、SIGTERMをメインのCeleryプロセスに送信することです(_kill -s 15 `cat /var/run/celeryd.pid`
_) 、次にそれが死ぬのを待って再起動します(_python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]
_)。
タスクが長時間実行されるため、これは通常、シャットダウンに1〜2分かかることを意味します。その間、新しいタスクは処理されず、現在サイトにいるユーザーに顕著な遅延が発生します。 Celeryにシャットダウンするように指示する方法を探していますが、すぐに新しいCeleryインスタンスを起動して、新しいタスクの実行を開始します。
機能しなかったもの:
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)
と文句を言い、すぐに終了します。 (これはCelery自体のバグのように見えます;私は 彼らに知らせてください それについて。)celerydには--autoreloadオプションがあります。有効にすると、セロリワーカー(メインプロセス)はセロリモジュールの変更を検出し、すべてのワーカープロセスを再起動します。 SIGHUPシグナルとは対照的に、自動リロードは、現在実行中のタスクが終了すると、各プロセスを個別に再起動します。これは、1つのワーカープロセスが再起動している間、残りのプロセスがタスクを実行できることを意味します。
http://celery.readthedocs.org/en/latest/userguide/workers.html#autoreloading
最近、SIGHUPのバグを修正しました: https://github.com/celery/celery/pull/662
rm *.pyc
これにより、更新されたタスクが再ロードされます。私は最近このトリックを発見しました、私はただ厄介な副作用がないことを願っています。
少し遅れますが、deletingというファイルcelerybeat.pidで修正できます。
働いた私にとって。
セロリのウォームシャットダウンにSIGHUP(1)を使用しています。それが実際にウォームシャットダウンを引き起こすかどうかはわかりません。ただし、SIGINT(2)はウォームシャットダウンを引き起こします。 SIGHUPの代わりにSIGINTを試してから、スクリプトで手動でセロリを開始してください(私は推測します)。
私はあなたがこれを試すことができると思います:
kill -s HUP ``cat /var/run/celeryd.pid``
python manage.py celeryd --pidfile=/var/run/celeryd.pid
HUP
はすべての無料ワーカーをリサイクルし、実行中のワーカーを実行し続けることができ、HUP
はこれらのワーカーを信頼できるようにします。その後、新しいセロリワーカーのメインプロセスとワーカーを安全に再起動できます。タスクが終了すると、古い労働者は自殺する可能性があります。
私はこの方法を本番環境で使用しましたが、現在は安全のようです。これがお役に立てば幸いです。
カスタムpidファイル名で起動できますか?おそらくタイムスタンプが付けられており、どのPIDを強制終了するかを知るためにそれをキーオフしますか?
CELERYD_PID_FILE="/var/run/celery/%n_{timestamp}.pid"
^タイムスタンプの構文はわかりませんが、知っているか、見つけることができますか?
次に、現在のシステム時間を使用して古いpidを削除し、新しいpidを起動しますか?