了解芹菜有问题

时间:2015-02-19 12:00:21

标签: python django celery

这是我第一次学习芹菜和django。我在virtualenv中安装了最新版本的芹菜(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>

更新

tasks.py:

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

我想通过celery执行的是添加Count的x直到它等于50,这样每个计算和结果值将异步存储。 因此,在每3秒后,我应该看到count.x的值异步变化,直到值为50 。但是在模板中,我得到了与我发布的相同的价值。我错过了什么?请你帮我理解。谢谢。

2 个答案:

答案 0 :(得分:2)

芹菜不适用于此

您尝试做的事情可能是通过纯粹的js甚至是使用ajax django视图来实现的。

您可以在js中使用计时器对服务器进行异步调用,并每隔3秒询问当前值。然后,您应该使用js甚至JQuery相应地更新html。

结帐Django REST Framework。使用异步调用服务器非常方便。

Celery用于什么

Celery用于繁重的后台任务,可以通过不同的计算机或异步执行,因此请求不会在高处理时间内超时或资源得到更好的管理。它不会做任何与模板渲染相关的事情,因为它主要是一个任务队列实用程序。

答案 1 :(得分:1)

调用add.delay在worker中启动异步任务,并立即返回AsyncResult个对象。如果要访问任务的实际返回值,则需要调用AsyncResult.get()。这将阻止,直到工作人员完成任务。

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

documentation

中的更多详细信息