1

这并不重要,但这是对这个问题的跟进。

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

4

1 回答 1

1

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

于 2011-01-23T21:48:59.357 回答