python - 如何在 Kubernetes 环境中正确终止 celery 任务?
问题描述
如何正确杀死在 kubernetes 环境中的容器上运行的 celery 任务?整个应用程序的结构(全部用 Python 编写)如下:
向我们的 API 发出请求的 SDK;
一种 Kubernetes 结构,其中一个 pod 运行 API,其他 pod 运行 celery 容器,以处理一些可由 API 触发的长时间运行的任务。这些芹菜容器自动缩放。
假设我们调用一个 SDK 方法,该方法反过来向 API 发出请求,触发在 celery 容器上运行的任务。如果需要,终止此任务的正确/优雅方法是什么?我知道 celery 任务有一个revoke()
方法,但是我尝试使用这种方法,但它不起作用,即使使用terminate=True
and signal=signal.SIGKILL
(也许这与我使用 Azure 服务总线作为代理的事实有关?)
也许芹菜任务与其相应容器名称之间的映射会有所帮助,但我也找不到获取此信息的方法。
任何帮助和/或想法将不胜感激。
解决方案
我找到的解决方案是写入 API 和 Celery 容器共享的文件。在此文件中,每当捕获到中断时,都会将标志设置为true
. 在芹菜容器内,我会定期检查此类文件的内容。如果标志设置为true
,那么我会优雅地清理并引发错误。
推荐阅读
- python-2.7 - 当我一次初始化两个变量时,为什么我得到这个错误'int' object is not iterable
- ruby-on-rails - 当我尝试执行 for 循环时,没有将 Symbol 隐式转换为 Integer
- tsql - T-SQL order by 并且只取最高值
- docker - docker-desktop 安装后在 windows 10 中找不到 daemon.json 文件
- javascript - 如何检查参数是否是代理外来对象?
- php - 我怎样才能得到这个正则表达式输出?
- android - LLVM:找不到命令 llvm-readobj
- xml - 将当前元素的子元素/子属性与以下元素的子元素/子属性进行比较
- android - 使用数据绑定时视图会闪烁片刻
- python-3.x - python中k-cross验证的实现