如何在不终止未完成的芹菜任务的情况下重新启动heroku应用程序

时间:2018-11-23 20:30:31

标签: python django heroku celery

我在heroku上有一个django Web应用程序,其中一些芹菜任务可能在后台运行。 Redis用作代理。

问题是,当我在执行某些任务时使用heroku restart或通过heroku container:release重启heroku应用程序时,它们被SIGTERM杀死,这意味着这些任务永远不会完成。

2018-11-23T19:35:24.506833+00:00 heroku[beat.1]: Restarting
2018-11-23T19:35:24.507645+00:00 heroku[beat.1]: State changed from up to starting
2018-11-23T19:35:24.517551+00:00 heroku[web.1]: Restarting
2018-11-23T19:35:24.518013+00:00 heroku[web.1]: State changed from up to starting
2018-11-23T19:35:24.528684+00:00 heroku[worker.1]: Restarting
2018-11-23T19:35:24.529175+00:00 heroku[worker.1]: State changed from up to starting
2018-11-23T19:35:24.952139+00:00 app[worker.1]: 
2018-11-23T19:35:24.952156+00:00 app[worker.1]: worker: Warm shutdown (MainProcess)
2018-11-23T19:35:24.949622+00:00 heroku[worker.1]: Stopping all processes with SIGTERM
2018-11-23T19:35:24.996307+00:00 heroku[worker.1]: Process exited with status 143
2018-11-23T19:35:25.456920+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2018-11-23T19:35:25.480748+00:00 app[web.1]: [2018-11-23 19:35:25 +0000] [16] [INFO] Handling signal: term
2018-11-23T19:35:25.481026+00:00 app[web.1]: [2018-11-23 19:35:25 +0000] [19] [INFO] Worker exiting (pid: 19)
2018-11-23T19:35:25.481491+00:00 app[web.1]: [2018-11-23 19:35:25 +0000] [20] [INFO] Worker exiting (pid: 20)
2018-11-23T19:35:25.481519+00:00 app[web.1]: [2018-11-23 19:35:25 +0000] [21] [INFO] Worker exiting (pid: 21)
2018-11-23T19:35:25.623274+00:00 heroku[web.1]: Process exited with status 143
2018-11-23T19:35:25.816061+00:00 heroku[beat.1]: Stopping all processes with SIGTERM
2018-11-23T19:35:25.928498+00:00 heroku[beat.1]: Process exited with status 143

根据我在互联网上发现的信息,由SIGTERM引起的热关机应等待任务完成,但这没有发生。他们只是被杀死。

  • 那是为什么?
  • 我是否必须配置一些东西才能实现所需的行为?还是只是行不通?

根据当前行为,我不确定如何进行部署,除非我以某种方式检查没有任何任务正在运行,然后重新启动。

1 个答案:

答案 0 :(得分:0)

这里的问题是heroku向芹菜发送了错误的信号,而不是热关机,并被杀死以重新启动。

从芹菜4开始(如果我没记错的话),您可以告诉芹菜听不同的信号。对于我们来说,这很有效。

将您的Procfile更改为包含REMAP_SIGTERM=SIGQUIT用于您的工作进程:

celeryworker: REMAP_SIGTERM=SIGQUIT  celery -A testproject worker

这将具有芹菜,例如在本地排队的重新排队任务。

要记住: 大约10或20秒后,仍然会有致命的一击。因此,如果您的任务运行时间更长,则必须调整acks_late