24

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 を送信する必要があるメイン プロセスであるかを知る方法がありません。また、メイン プロセスがまだ生きているかどうかを確認する信頼できる方法もありません。
4

7 に答える 7

5

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

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

于 2012-03-10T18:56:46.860 に答える
3

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

于 2012-05-31T09:03:57.683 に答える
0

カスタムpidファイル名で起動できますか?タイムスタンプが付けられている可能性があり、それをキーオフして、どのPIDを強制終了するかを確認しますか?

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

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

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

于 2012-03-10T00:23:38.907 に答える
0

少し遅れていますが、 celerybeat.pidというファイルを削除することで修正できます。

私のために働いた。

于 2014-12-10T17:47:09.787 に答える