web-dev-qa-db-ja.com

正常に再起動Django Celeryインスタンス

再起動中にタスクを失うことなくCeleryを再起動するための最良の方法は何でしょうか。

私は現在、celeryで提供されているinit.d /スクリプトを使用してデーモンとして実行しています-すべてがうまく機能しています。

それでも、コードの更新を確認するには、再起動する必要があります(私は思いますか?)。私の懸念は、誰かが写真をアップロードし、セロリがタスクを再開している5秒ほどのウィンドウで写真を処理したい場合、タスクが永久に失われ、奇妙な問題が発生し始めることです。

その間にトランザクションを失うことなくセロリのコードをリロードするための提案された方法はありますか?

ありがとう、

フィル

4
philipk

TERM信号でタスクを失うことなく、セロリワーカーを安全に再起動できます。したがって、セロリは現在のタスクを終了して死にます。

何か問題が発生した場合にタスクを再試行する場合は、acks_lateオプション(Task.acks_late/CELERY_ACKS_LATE)を使用することもできます。

Q:どうすればワーカーを安全にシャットダウンできますか? (from: http://celery.readthedocs.org/en/latest/faq.html#how-can-i-safely-shut-down-the-worker

回答:TERMシグナルを使用すると、ワーカーは現在実行中のすべてのジョブを終了し、できるだけ早くシャットダウンします。タスクが失われることはありません。

TERMを数回試し、シャットダウンする機会が得られるまで数分待った場合を除いて、KILLシグナル(-9)でワーカーを停止しないでください。タスクを実行するかのように、実行中にタスクが終了する可能性があり、acks_lateオプション(Task.acks_late/CELERY_ACKS_LATE)が設定されていない限り、タスクは再実行されません。

ワーカーを停止するには(from: http://celery.readthedocs.org/en/latest/userguide/workers.html#worker-stopping

Q:ワーカーを停止します

シャットダウンは、TERMシグナルを使用して実行する必要があります。

TERMシグナルを送信するには、LinuxコマンドKILLを使用します(from: http://linux.about.com/od/commands/l/blcmdl1_kill.htm

kill-プロセスを終了します概要

キル[-sシグナル| -p] [-a] [-] pid ... kill -l [信号]説明

コマンドkillは、指定されたシグナルを指定されたプロセスまたはプロセスグループに送信します。信号が指定されていない場合は、TERM信号が送信されます。 TERMシグナルは、このシグナルをキャッチしないプロセスを強制終了します。他のプロセスでは、KILL(9)信号を使用する必要がある場合があります。これは、この信号をキャッチできないためです。

2
Lucas Castro