Heroku dyno で celeryd を実行しています。シャットダウンして、以前に少なくとも 1 つのタスクを処理した (完了した) 場合、正しくシャットダウンせず、Heroku からエラー R12 (終了タイムアウト) が発生します。
Procfile
(Djangoとdjango-celeryを介して)私からcelerydを実行する方法は次のとおりです。
celeryd: python manage.py celeryd -E --loglevel=INFO
これをトリガーするために私がやっていることは次のとおりです。
> heroku ps:scale web=0 celeryd=0 --app myapp
そして、ここに私が得ているログ出力があります:
2012-09-07T12:56:31+00:00 heroku[celeryd.1]: State changed from up to down
2012-09-07T12:56:31+00:00 heroku[api]: Scale to celeryd=0, web=1 by mail@mydomain.com
2012-09-07T12:56:32+00:00 heroku[web.1]: State changed from up to down
2012-09-07T12:56:32+00:00 heroku[api]: Scale to web=0 by mail@mydomain.com
2012-09-07T12:56:34+00:00 heroku[celeryd.1]: Stopping all processes with SIGTERM
2012-09-07T12:56:35+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2012-09-07T12:56:37+00:00 heroku[web.1]: Process exited with status 143
2012-09-07T12:56:43+00:00 heroku[celeryd.1]: Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM
2012-09-07T12:56:43+00:00 heroku[celeryd.1]: Stopping remaining processes with SIGKILL
2012-09-07T12:56:45+00:00 heroku[celeryd.1]: Process exited with status 137
もともと、セロリ 2.5.5 でこれを経験しました。3.0.9 にアップグレードしましたが、まだ同じ問題があります。
私が知る限り、私のタスクはすべて完了しました。このエラーは、その celery dyno で単一のタスクを実行し、完了するのに十分な時間を与えてから dyno をシャットダウンすることで確実に再現できます。
他に何を確認すればよいかわかりません。これをトラブルシューティングする方法はありますか?タスクがすでに完了しているときに、セロリドが Heroku の SIGTERM に応答するのをブロックするものは何ですか?