13

我在 Heroku dyno 上运行 celeryd。当我关闭它并且它之前已处理(甚至完成)至少一项任务时,它没有正确关闭并且我从 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

最初,我在 celery 2.5.5 上遇到过这种情况。现在我升级到 3.0.9,我仍然有同样的问题。

据我所知,我的任务已经全部完成。通过在 celery dyno 上运行单个任务,给它足够的时间来完成然后关闭 dyno,这个错误可以可靠地重现。

我不知道还要检查什么。知道如何解决这个问题吗?当任务已经完成时,什么会阻止 celeryd 响应 Heroku 的 SIGTERM?

4

2 回答 2

1

我遇到了同样的问题。我不确定,但它可能已修复

带有 -B 参数的 Worker 没有正确关闭节拍实例。

因此,如果您在工作实例中使用 celery beat,则可能需要升级。

于 2014-01-07T04:49:19.430 回答
-1

在我看来,这听起来像是 celery 没有捕捉到SIGTERM信号并对它做出反应,一直等到信号SIGKILL到来。

这个拉取请求可能会帮助你: https ://github.com/cybertoast/celery/commit/e9a007b982b0f9268174ae94b351a9275eaef4a3

于 2013-06-26T20:36:38.103 回答