获取特定用户的待处理任务数

时间:2013-06-03 06:46:02

标签: django task celery

在我的某个应用程序中,我希望限制用户每个日历月仅进行一次特定数量的文档转换,并希望通知他们他们所做的转化以及他们在该日历月中仍可进行的转化次数

所以我做了类似下面的事情。

class CustomUser(models.Model):
    # user fields here

    def get_converted_docs(self):
       return self.document_set.filter(date__range=[start, end]).count()

    def remaining_docs(self):
        converted = self.get_converted_docs()
        return LIMIT - converted

现在,使用芹菜在后台完成文档转换。因此,可能存在转换任务未决的情况,因此在这种情况下,上述方法会让用户进行额外转换,因为暂挂任务未包含在计数中。

如何在此处获取特定CustomUser对象的待处理任务数?

更新

好,所以我尝试了以下内容:

from celery.task.control import inspect

def get_scheduled_tasks():
    tasks = []
    scheduled = inspect().scheduled()
    for task in scheduled.values()
        tasks.extend(task)
    return tasks

这给了我一个计划任务的列表,但现在上面提到的任务arg的所有值都是unicode,如下所示:

u'args': u'(<Document: test_document.doc>, <CustomUser: Test User>)'

有没有一种方法可以解码回原始的django对象,以便我可以过滤它们?

1 个答案:

答案 0 :(得分:2)

将文档的状态存储在其他位置,不要检查队列。 为此创建单独的模型,或者例如。在您的文档模型上有一个状态,至少独立于您的队列。这应该有几个好处:

  • 检查队列可能很昂贵 - 也取决于后端。正如你所看到的那样,事情也变得困难。
  • 例如,您的队列可能不是持久性的。你的服务器崩溃并使用类似Redis的东西你会丢失这些信息,所以在其他地方有一个日志能够重建队列是一件好事。)