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

问题描述:

并不重要,但这是this question的后续操作。使用Django Celery将视图计数器添加到对象

我想保留一次数据库中每个对象的查看次数。假设我们有一个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

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