使用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
。