2015-02-19 3 views
2

Это мой первый опыт изучения сельдерея и джанго. Я установил последнюю версию сельдерея (celery==3.1.17) и rabbitmq (amqp==1.4.6) внутри моего виртуального. Я учусь от celery's website.Проблемы с пониманием сельдерея

models.py:

from django.db import models 

# Create your models here. 

class Count(models.Model): 
    x = models.IntegerField() 

    def __unicode__(self): 
     return self.x 

views.py:

def home(request): 
    if request.POST: 
     form = CountForm(request.POST) 
     if form.is_valid(): 
      if form.cleaned_data: 
       count = form.save() 
       count.x = add.delay(count.x) 
       return HttpResponseRedirect('/') 

    else: 
     all_counts = Count.objects.all() 
     form = CountForm() 
    return render(request, 'home.html',{ 
     'form':form, 
     'all_counts':all_counts 
     }) 

шаблона:

<body> 
    <form method="post" action="."> 
     {% csrf_token %} 
     {{form.as_p}} 
     <input type="submit" value="post"> 
    </form> 
    {% if all_counts.count > 0 %} 
     {% for count in all_counts %} 
      <p>ID {{count.id}} = :: Value = {{count.x}}</p> 
      <br/> 
     {% endfor %} 
    {% else %} 
     <p>No counts</p> 
    {% endif %} 
</body> 

Update

tasks.py:

@app.task 
def add(x): 
    while x <= 50: 
     return x + 1 
     time.sleep(3) 

Что я хочу выполнять через сельдерей, чтобы добавить й граф, пока она не равна 50, так что каждое вычисление и значение результата будет храниться асинхронно. Следовательно, через каждые 3 секунды я должен увидеть значение count.x, изменяя асинхронно, до значения 50. Но в шаблоне я получаю то же значение, что и я. Что мне не хватает? Пожалуйста, помогите мне понять. Спасибо.

+0

Не является сельдереем для асинхронных задач? – Alvaro

+0

@ Альваро Да .. Мне что-то не хватает ... Думаю, мне нужно изменить представления, чтобы они не блокировались, чтобы вычисление и результат были асинхронными. Вы можете мне помочь? – Geum

+0

Я не так свободно владею сельдереем, но вы должны проверить различные серверы обмена сообщениями, которые можно использовать для отслеживания состояния задачи. Проверьте это: http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#keeping-results – Alvaro

ответ

2

Сельдерей не предназначен для этого.

То, что вы пытаетесь сделать, может быть достигнуто с помощью чистого js или даже с представлением ajax django.

Вы можете использовать таймер в js для совершения асинхронных вызовов на сервер и задать текущее значение каждые 3 секунды. Затем вам следует обновить html соответственно, используя js или даже JQuery.

Отъезд Django REST Framework. Это довольно удобно для работы с асинхронными вызовами на сервере.

Что Сельдерей для

Сельдерей для тяжелых фоновых задач, которые могут быть выполнены либо на другой машине или асинхронном, так что просьба не тайм-аут на высокой времени обработки или ресурсы лучше удалось. Он не будет делать ничего, связанного с вашим рендерингом шаблонов, в основном в качестве утилиты очереди задач.

+0

Я не думаю, что DRF поможет. OP просто хочет простой вид, который отвечает единственным значением: DRF для этого массово перегружается. –

+0

Несомненно, но я предполагаю, что это просто глупый пример. Я бы даже не использовал ajax для счетчика. – Alvaro

+0

@Alvaro. Я не хочу, чтобы сельдерей выполнял приложение реального времени, которое было бы любезным, что асинхронно вызывало сервер. Я просто хочу, чтобы сельдерей выполнял вычисления на фоне, так что через каждые 3 секунды, если будет увеличивать значение 'count.x', и если я обновляю страницу, я должен увидеть изменение значения, пока значение не будет 50. I надеюсь, теперь я был ясен. – Geum

1

Вызов add.delay запускает асинхронную задачу у рабочего и немедленно возвращает объект AsyncResult. Если вы хотите получить доступ к фактическому возвращаемому значению задачи, вам необходимо позвонить AsyncResult.get(). Это будет заблокировано, пока задача не будет выполнена у работника.

return_value = add.delay(count.x).get() 

Подробнее в documentation.

+0

ОК. Я уверен, что у меня что-то не хватает? Как выполнить вычисление и сохранить значение асинхронно без блокировки? – Geum

Смежные вопросы