gpt4 book ai didi

python - 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关闭工作人员

转载 作者:IT老高 更新时间:2023-10-28 20:56:04 24 4
gpt4 key购买 nike

我对此进行了大量研究,但我很惊讶我还没有在任何地方找到一个好的答案。

我在 Heroku 上运行一个大型应用程序,并且我有一些运行很长时间的 celery 任务,并在任务结束时保存结果。每次我在 Heroku 上重新部署时,它都会发送 SIGTERM(最终发送 SIGKILL)并杀死我正在运行的工作人员。我正在尝试找到一种方法让工作实例优雅地关闭自己并重新排队以供稍后处理,以便最终我们可以保存所需的结果而不是丢失排队的任务。

我找不到让工作人员正确收听 SIGTERM 的方法。我得到的最接近的,在直接运行 python manage.py celeryd 时有效,但在使用工头模拟 Heroku 时 NOT,如下:

@app.task(bind=True, max_retries=1)
def slow(self, x):
try:
for x in range(100):
print 'x: ' + unicode(x)
time.sleep(10)
except exceptions.MaxRetriesExceededError:
logger.error('whoa')
except (exceptions.WorkerShutdown, exceptions.WorkerTerminate) as exc:
logger.error(u'retrying, ' + unicode(exc))
raise self.retry(exc=exc, countdown=10)
except (KeyboardInterrupt, SystemExit) as exc:
print 'retrying'
raise self.retry(exc=exc, countdown=10)
else:
return x
finally:
logger.info('task ended!')

当我在工头中启动这个 celery 任务并按 Ctrl+C 时,会发生以下情况:

^CSIGINT received
22:20:59 system | sending SIGTERM to all processes
22:20:59 web.1 | exited with code 0
22:21:04 system | sending SIGKILL to all processes
Killed: 9

所以很明显,我在其他帖子中看到的任何 celery 异常,以及 KeyboardInterruptSystemExit 异常都没有正确捕获 SIGTERM 并关闭工作程序。

这样做的正确方法是什么?

最佳答案

从 >= 4 版本开始,Celery 提供了一个专门针对 Heroku 的特殊功能,该功能开箱即用地支持此功能:

$ REMAP_SIGTERM=SIGQUIT celery -A proj worker -l info

来源:https://devcenter.heroku.com/articles/celery-heroku#using-remap_sigterm

关于python - 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关闭工作人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29872998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com