gpt4 book ai didi

python-3.x - 删除已撤销的 Celery 任务

转载 作者:行者123 更新时间:2023-12-04 18:35:07 31 4
gpt4 key购买 nike

根据docstask.revoke() :

All worker nodes keeps a memory of revoked task ids, either in-memory or persistent on disk





Revoking tasks works by sending a broadcast message to all the workers, the workers then keep a list of revoked tasks in memory. When a worker starts up it will synchronize revoked tasks with other workers in the cluster.



这听起来像是在您撤销它们之后任务仍然存在。我不明白为什么没有明确的方法来撤销任务并将其从队列中删除。

文档似乎暗示您需要无限期地保留已撤销任务的列表,以确保新员工在某些情况下不会接他们。

我也知道有一个功能可以完全清除任务队列,但这不是我想要的。

有没有办法撤销一个任务并从 Celery 的任务队列中清除它(并且只清除它)?

最佳答案

无法仅删除一条消息 在队列中,而不是用 purge 将它们全部删除或在您的 broker 中使用手动命令.

但是,您可能不介意 一个被工作人员处理后被撤销的任务将从队列中删除 .因此,您不必维护一个永久撤销的 id 列表。

你应该只在这个列表中保留一个 id,因为它没有被工作人员处理,因为工作人员很忙或者任务被安排在以后。

如果您的所有工作人员可以同时停止并且您希望保留标记的已撤销任务,则该列表应该是持久的。否则,一个新工作人员会询问已经在运行的工作人员有关要标记为已撤销的任务。

注:我分析了一个以 Redis 作为 broker 和 backend 的案例来得到答案。被撤销的任务最终从队列中移除并作为结果可见(标记为已撤销)。

例子:

  • id 为“A”的任务被插入队列并计划在 1 小时内完成
  • 任务“A”是revoke()因此会向所有工作人员发送一条消息,将任务标记为已撤销。 id 在每个 worker 的撤销列表中(参见日志 Tasks flagged as revoked: A )
  • 任务“A”仍在队列中等待其 ETA
  • 一小时后, worker 执行任务。由于任务被标记为已撤销,worker 不会执行任务,而是立即将任务结果写入后端。结果表明该任务已被撤销(因此未执行)。


  • 我不知道您不能直接从队列中删除任务的确切原因。但我的直觉是:
  • 所有代理可能不允许删除队列中间的元素
  • 立即删除任务并让任务系统保持一致可能更难。由于 Celery 团队的劳动力有限,如果更简单的解决方案能够胜任,他们不想支持复杂的事情
  • 关于python-3.x - 删除已撤销的 Celery 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46019528/

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