使用Django Celery向对象添加视图计数器

时间:2011-01-23 18:07:22

标签: django celery

这不重要,但这是this question的后续行动。

我想要计算数据库中每个对象被查看的次数。假设我们有一个Person模型,有几个实例。我们想要计算Person模型中每个实例的查看次数,使用Django Celery来避免等待数据库写入。

目前我正在这样做:

from celery.decorators import task

class Person(models.Model):
    name = models.CharField(max_length=50)


class Stats(models.Model):
    person = models.ForeignKey('Person', unique=True)
    @task
    def addView(self):
        se = StatEvent()
        se.save()
        self.views.add(se)

class StatEvent(models.Model):
    date = models.DateTimeField(auto_now_add=True)

然后,每次调用列出一页人员的视图时,我都会得到所有人,更新这样的统计数据:

person.get_stats().addView.delay(person.get_stats())

然后我返回要在浏览器中显示的人员列表。我认为统计信息的更新会异步发生,但是在页面显示之前会有明显的长时间延迟,这可以通过在Celery命令窗口中为每次添加显示print语句来确认。只有在最后一次统计更新后才会呈现该页面。

如何确保用户不等待数据库更新完成?

更新

我认为可能与没有足够的工作进程分别处理每个人有关,所以我做了一个接受人员列表作为参数的函数,并将其用作要执行的任务。因此,队列中只有一个任务:

@task(ignore_result=True)
def addViews(persons):
    for person in persons:
        stats = listing.get_stats()
        se = StatEvent()
        se.save()
        stats.views.add(se)

然而,当打印到控制台时,如下所示:

    print "adding"
    print tasks.addClicks(persons)
    print "done"

然后在“添加”和“完成”步骤之间有明显的延迟,并且函数的返回值为None

1 个答案:

答案 0 :(得分:1)

原来我怀疑没有足够的工人是正确的。我将新内容放在一个任务中的新功能解决了这个问题 - 我在最后一次.delay调用时错过了tasks.addClicks(persons)