【问题标题】:get number of pending tasks for a specific user获取特定用户的待处理任务数
【发布时间】:2013-05-29 06:48:39
【问题描述】:

在我的一个应用程序中,我想限制用户每个日历月只能进行特定数量的文档转换,并希望通知他们他们已经进行的转换以及他们在该日历月仍可以进行的转换次数.

所以我做了如下的事情。

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

现在,文档转换是在后台使用 celery 完成的。因此,可能会出现转换任务处于待处理状态的情况,在这种情况下,上述方法会让用户进行额外的转换,因为待处理的任务不包括在计数中。

如何在此处获取特定 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

这给了我一个计划任务列表,但现在所有值都是unicode,上述任务参数看起来像这样:

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

有没有办法将它们解码回原始django 对象,以便我可以过滤它们?

【问题讨论】:

  • 为什么不在启动 celery 任务之前创建一个文档,并在任务运行时更新该记录。这样,您将摆脱额外转换的情况
  • @Aldarund 我正在考虑的方法与您建议的方法非常相似,我正在考虑在我的模型中添加一个IntegerField,我将在调用任务之前将其加一,在任务方法中,当任务成功时,我们将从该字段中减去 1 ..

标签: django task celery


【解决方案1】:

将文档的状态存储在其他地方,不要检查您的队列。 要么为此创建一个单独的模型,要么例如。在您的文档模型上有一个状态,至少独立于您的队列。这应该有几个优点:

  • 检查队列可能很昂贵 - 也取决于后端。如您所见,这也可能很困难。
  • 您的队列可能不是持久的,例如。您的服务器崩溃并使用 Redis 之类的东西会丢失此信息,因此在其他地方有一个日志以便能够重建队列是一件好事)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 2013-11-19
    • 2019-08-29
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多