用相同的args / kwargs撤销芹菜任务

时间:2017-10-19 13:17:42

标签: python celery

想象一下,使用一组特定的args和kwargs进行长时间运行的任务。在开始新任务之前,是否有机会使用相同的args / kwargs撤销所有正在运行和挂起的任务,因为我只对最后添加的任务的结果感兴趣。 (基础数据在两次调用之间发生变化)

我尝试迭代inspect.active()inspect.registered()inspect.scheduled()的结果来获取所有任务,然后filter/revoke那些我的args和kwargs的问题。

但这并不可靠,因为检查所有工人和寻找任务的时间太长了。

任何人都可以让我朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:0)

如果检查工作人员的速度变慢,则最好通过辅助数据存储进行检查,例如,像redis这样的键值存储。您为功能添加了一个“锁”,因此您知道它已经启动了。

排队任务时:

  • 检查商店中是否已经存在
    • 是:引发异常
    • 否:将相关任务信息作为项目添加到您的商店。
  • 将任务添加到芹菜任务队列中

一个工人将执行它

  • 执行
  • 从存储中删除

有一个基于Redis的现成实现:

celery-oncepermalink to current commit)。

您必须将其指定为任务的base

from celery import Celery
from celery_once import QueueOnce

@celery.task(base=QueueOnce)
def sum(a, b):
    ...

您还可以指定要考虑的参数和更多设置,请阅读自述文件以获取更多详细信息。