Добавление счетчика просмотров к объектам с использованием Django Celery - PullRequest
1 голос
/ 23 января 2011

Не то, чтобы это имело значение, но это продолжение этого вопроса .

Я хочу вести подсчет количества просмотров каждого объекта в моей базе данных.Допустим, у нас есть модель 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.

1 Ответ

1 голос
/ 24 января 2011

Оказывается, мое первоначальное подозрение о том, что не хватает рабочих, было правильным.Моя новая функция, которая объединяет все в одну задачу, решила проблему - я просто пропускал .delay в последнем tasks.addClicks(persons) вызове.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...