这不重要,但这是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
。
答案 0 :(得分:1)
原来我怀疑没有足够的工人是正确的。我将新内容放在一个任务中的新功能解决了这个问题 - 我在最后一次.delay
调用时错过了tasks.addClicks(persons)
。