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