T.P*_*Poe 5 python django heroku celery
我在 Heroku 上有一个 Django Web 应用程序,其中多个 celery 任务可能在后台运行。Redis 用作代理。
问题是,当我在执行某些任务时使用heroku restart或通过部署重新启动heroku应用程序时,它们会被SIGTERM杀死,这意味着任务永远不会完成。heroku container:release
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
Run Code Online (Sandbox Code Playgroud)
从我在互联网上发现的情况来看,由 SIGTERM 引起的热关闭应该等待任务完成,但它没有发生。他们只是被杀了。
根据当前的行为,我不确定如何进行部署,除非我以某种方式检查没有任务正在运行,然后重新启动。
这里的问题是 heroku 向 celery 发送了错误的信号,它不会热关闭并在重新启动时被杀死。
从 Celery 4 开始(如果我没记错的话)你可以告诉 celery 听不同的信号。对我们来说这很有效。
更改您的工作流程Procfile以包括:REMAP_SIGTERM=SIGQUIT
celeryworker: REMAP_SIGTERM=SIGQUIT celery -A testproject worker
Run Code Online (Sandbox Code Playgroud)
例如,这将使 celery 重新排队本地排队的任务。
请记住:大约 10 或 20 秒后仍然会发生艰难的杀戮。因此,如果您的任务运行时间较长,则必须进行调整acks_late。
| 归档时间: |
|
| 查看次数: |
1229 次 |
| 最近记录: |