2014-08-31 2 views
2

Я пытаюсь заставить сельдерей работать, но у меня есть некоторые проблемы, которые я не совсем понимаю.Задача celery и django queryset cache

Я наследуя модель из пакета 3 партии

class BaseModel(models.Model): 
    class Meta: 
     abstract = True 

    def do(self, a=1, b=2): 
     return a + b 

Затем;

from thirdpartypackage.models import BaseModel 

class MyModel(BaseModel): 
    some_field = models.IntegerField(default=0) 

    @current_app.task(filter=task_method): 
    def do(self, a=1, b=1): 
     self.some_field = super(MyModel, self).do(a=a, b=b) 
     self.save() 

Теперь всякий раз, когда я бегу задача, которая включает в себя запрос дб, например:

def my_view(request, pk=None): 
    obj = get_object_or_404(MyModel, pk=pk) 

    obj.do.delay(a=2, b=4) 

    return HttpResponse('the answer is: {}'.format(obj.some_field)) 

Я вижу задачу всплывают в сельдерее (цветок), но фактический ответ HTTP не обновлять результат, после того, как я сильно обновляюсь, я вижу обновление результата, хотя это кажется ненадежным.

Незнакомец, поэтому на реальном сервере (apache в моем случае) это не похоже на трюк (освежающий), хотя цветок говорит «успех». Когда я перехожу в оболочку (оболочка python manage.py) и сразу вызываю задание, я сразу вижу результат.

Есть ли что-нибудь о кэшировании django/mysql, которое я должен знать? Как принудительно обновлять файлы?

Если я вызываю функцию непосредственно (без задержки) не работает сразу, как ожидалось:

def my_view(request, pk=None): 
    obj = get_object_or_404(MyModel, pk=pk) 

    obj.do(a=2, b=4) 

    return HttpResponse('the answer is: {}'.format(obj.some_field)) 

ответ

2

Там нет проблем с кэшированием DB. Проблема в том, что вы читаете значение и возвращаете его в HttpResponse, прежде чем у Сельдерея есть шанс запустить его. task.delay() - это асинхронный вызов, который создает задание, и немедленно возвращает. Фактическая работа должна быть подхвачена рабочим и выполнена, что часто происходит с некоторой задержкой обработки.

Вы можете решить это, используя различные методы, например. используя Javascript и AJAX для обновления интерфейса после завершения задания.

+0

хотя действительный ваш пункт, кажется, не вызывает проблемы. Я вижу, что работа заканчивается почти мгновенно (цветок сельдерея), и, поскольку я покрывал, освежающий, похоже, не помогает на веб-сервере apache, но спасибо, что я буду исследовать дальше – user2298943

+0

Будьте осторожны с интерпретацией результатов, говорящих, что работа ** закончена * *. По умолчанию задачи ** немедленно подтверждаются **, когда выскочили из очереди, если вы явно не указали, что они являются идемпотентными, включив переключатель 'acks_late'. Подробнее здесь: http://celery.readthedocs.org/ru/latest/userguide/tasks.html –