这并不重要,但这是对这个问题的跟进。
我想记录我的数据库中每个对象被查看的次数。假设我们有一个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())
然后我返回要在浏览器中显示的人员列表。我认为统计信息的更新会异步发生,但是在显示页面之前有一个明显而漫长的延迟,这可以通过print
在 Celery 命令窗口中显示每个添加的语句来确认。该页面仅在最后一个统计信息更新后才呈现。
如何确保用户不等待数据库更新完成?
更新
我认为这可能与没有足够的工作进程来分别处理每个人有关,因此我创建了一个接受人员列表作为参数的函数,并将其用作要执行的任务。因此,队列中只有一项任务:
@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
.