web-dev-qa-db-ja.com

タスクを遅らせることなくCeleryを正常に再起動する方法

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インスタンスを起動して、新しいタスクの実行を開始します。

機能しなかったもの

  • SIGHUPをメインプロセスに送信します。これにより、Celeryはウォームシャットダウンを実行してから再起動することにより、「再起動」を試みました。これには時間がかかるだけでなく、機能しません。古いプロセスが終了する前に新しいプロセスが起動するため、新しいプロセスはERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)と文句を言い、すぐに終了します。 (これはCelery自体のバグのように見えます;私は 彼らに知らせてください それについて。)
  • SIGTERMをメインプロセスに送信し、すぐに新しいインスタンスを起動します。Pidfileと同じ問題です。
  • Pidfileを完全に無効にする:これがないと、ウォームシャットダウンを実行するときにSIGTERMを送信する必要があるメインプロセスが30Celeryプロセスのどれであるかを判断する方法がありません。また、メインプロセスがまだ生きているかどうかを確認する信頼できる方法もありません。
24
nitwit

celerydには--autoreloadオプションがあります。有効にすると、セロリワーカー(メインプロセス)はセロリモジュールの変更を検出し、すべてのワーカープロセスを再起動します。 SIGHUPシグナルとは対照的に、自動リロードは、現在実行中のタスクが終了すると、各プロセスを個別に再起動します。これは、1つのワーカープロセスが再起動している間、残りのプロセスがタスクを実行できることを意味します。

http://celery.readthedocs.org/en/latest/userguide/workers.html#autoreloading

4
mher

最近、SIGHUPのバグを修正しました: https://github.com/celery/celery/pull/662

3
Ivan Virabyan
rm *.pyc

これにより、更新されたタスクが再ロードされます。私は最近このトリックを発見しました、私はただ厄介な副作用がないことを願っています。

2
Régis B.

少し遅れますが、deletingというファイルcelerybeat.pidで修正できます。

働いた私にとって。

1
spac3_monkey

セロリのウォームシャットダウンにSIGHUP(1)を使用しています。それが実際にウォームシャットダウンを引き起こすかどうかはわかりません。ただし、SIGINT(2)はウォームシャットダウンを引き起こします。 SIGHUPの代わりにSIGINTを試してから、スクリプトで手動でセロリを開始してください(私は推測します)。

0
Debanshu Kundu

私はあなたがこれを試すことができると思います:

kill -s HUP ``cat /var/run/celeryd.pid`` 
python manage.py celeryd --pidfile=/var/run/celeryd.pid

HUPはすべての無料ワーカーをリサイクルし、実行中のワーカーを実行し続けることができ、HUPはこれらのワーカーを信頼できるようにします。その後、新しいセロリワーカーのメインプロセスとワーカーを安全に再起動できます。タスクが終了すると、古い労働者は自殺する可能性があります。

私はこの方法を本番環境で使用しましたが、現在は安全のようです。これがお役に立てば幸いです。

0
lasthuman

カスタムpidファイル名で起動できますか?おそらくタイムスタンプが付けられており、どのPIDを強制終了するかを知るためにそれをキーオフしますか?

CELERYD_PID_FILE="/var/run/celery/%n_{timestamp}.pid"

^タイムスタンプの構文はわかりませんが、知っているか、見つけることができますか?

次に、現在のシステム時間を使用して古いpidを削除し、新しいpidを起動しますか?

0
j_mcnally