2012-03-10 42 views
24

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

多分私の答えはhttp://stackoverflow.com/questions/9764913/how-do-i-restart-celery-workers-gracefully/16717128#16717128です。 – guettli

答えて

0

カスタムpidファイル名で起動できますか?おそらくタイムスタンプを付けられ、どのPIDを殺すかを知るための鍵を握っていますか?

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

^私は、タイムスタンプ構文を知らないが、多分あなたは何かあなたはそれを見つけることができますか?

その後、古いPIDを強制終了して新しいPIDを起動するために、現在のシステム時間を使用しますか?

+0

私は、この問題のテクニックの1つをこれと組み合わせる必要があると考えています。ブローカに応じて、タイムスタンプベースのpidfile( '--pidfile ='を使用)で新しいセロリを開始し、実行中のセロリプロセスすべてに 'SIGTERM 'を送ってウォームシャットダウンにすることができます古いcelerydがまだ暖かいシャットダウンを行っている間にこれを試していない限り、実際には1つしかないはずです)。 –

4

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

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

+14

'--autoreload'はライブ展開では推奨されていないとマークされていますが。 –

+1

プロダクションでは、このようなカスタムリローダで使用できます。http://www.indelible.org/ink/python-reloading/ – mher

3

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

+0

ありがとう!しかし、SIGHUPが終了して再起動する前にすべてのタスクが完了するのを待っているという事実を修正して、やはり私が避けようとしている遅延を引き起こします。あなたの修正を利用し、それを待つことなく再起動させる方法のアイデアは素晴らしいでしょう... – nitwit

+0

これは私が問題を解決した方法です。 長時間実行されているすべてのタスク(ビデオ変換、電子メール配信)は別のキューに入れ、別のワーカーによって処理されます。 SIGHUPをすべてのワーカーに送信すると、小さなタスクしかないので、デフォルトキューからワーカー処理タスクが長い間ブロックされないことがわかります。ビデオ変換は小さなタスクをブロックしません。ビデオ変換キューのみがしばらくブロックされています。しかし、これは私の場合は受け入れられます。 –

+0

だから、いくつかのテストの後、私はあなたの修正がSIGTERM問題を修正することも分かった。だから、私は最終的に、この問題を一度に解決するために、修正をマージしてCeleryを再起動することで対応しました: 'kill -s SIGTERM' 'cat/var/run/celeryd.pid'' && python manage.py celeryd --pidfile =/var/run/celeryd.pid [...] ' これをあなたの答えに入れることができれば、私はそれを受け入れるでしょう! – nitwit

2
rm *.pyc 

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

0

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

1

少し遅れて、それはcelerybeat.pidと呼ばれるファイルを削除することによって固定することができます。

私にはが働いています。

関連する問題