python - 运行芹菜任务时如何取消确认消息?
问题描述
现在我有一些同步作业,它们是有状态的,所以如果任务失败,我必须取消确认消息,然后让它们转到RabbitMQ
. 但是当我尝试引发错误时,我发现 celery 仍然会确认此消息,并且队列已被清除。
@celery.task(bind=True)
def my_task(self, *args, **kwargs):
raise ValueError
而且我发现 celery task 有一个名为 的方法retry
,但它会将任务添加到队列的后面。这不是我想要的。
@celery.task(bind=True)
def my_task(self, *args, **kwargs):
try:
raise ValueError
except Exception:
self.retry(countdown=15)
即使我不能用终止信号来做到这一点:
os.kill(os.getpid(), signal.SIGKILL)
我应该怎么办?celery 是否提供了一些错误,所以我可以提出这个错误来通知 celery 不承认我的消息?
解决方案
在文档https://docs.celeryproject.org/en/stable/userguide/configuration.html我发现:
task_acks_on_failure_or_timeout
默认情况下是enabled
.
所以我认为你应该尝试结合
task_acks_late=True
+task_acks_on_failure_or_timeout=False
实现NO acknowledgement when a task fails
.
推荐阅读
- c - 为什么这段代码开头需要分号
- apache-spark - Spark 依赖较少的模型导出如何工作?
- java - 从 jdk 8 迁移到 11,得到空字符串,之前是普通字符串
- angular - 创建组件实例并作为 [object HTMLelement] 传递给另一个组件
- regex - 如何在捕获组中捕获组?
- c++ - 如何在循环中增加和减少一系列数字
- python - 比较 django if 块中的两个 django 变量
- python - matplotlib 按钮未显示在同一窗口中
- php - PHP:它想要一个“对象”,所以我给它和对象,然后它错误地说它想要一个“数组”,给出了什么?
- javascript - 在实践中确保算法仅在需要时启动函数或仅在 jquery 中启动函数是否更好