理解芹菜有问题
Having problems understanding celery
这是我第一次学习celery和django。我已经在我的 virtualenv 中安装了最新版本的 celery (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。但是在模板中,我得到的值与我发布的值相同。我错过了什么?你能帮我理解吗?谢谢。
调用add.delay
在worker中启动一个异步任务,并立即returns AsyncResult
object。如果要访问任务的实际 return 值,则需要调用 AsyncResult.get()
。这将阻塞,直到任务在 worker 中完成。
return_value = add.delay(count.x).get()
documentation 中有更多详细信息。
芹菜不适合这个。
您尝试做的事情可能会通过纯 js 甚至 ajax django 视图来实现。
您可以在 js 中使用计时器对服务器进行异步调用并每 3 秒询问一次当前值。然后,您应该相应地更新 html,使用 js 甚至 JQuery。
查看 Django REST Framework。使用对服务器的异步调用非常方便。
芹菜有什么用
Celery 适用于繁重的后台任务,可以由不同的机器或异步执行,以便请求不会在高处理时间时超时或更好地管理资源。它不会做任何与您的模板渲染相关的事情,因为它主要是一个任务队列实用程序。
这是我第一次学习celery和django。我已经在我的 virtualenv 中安装了最新版本的 celery (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。但是在模板中,我得到的值与我发布的值相同。我错过了什么?你能帮我理解吗?谢谢。
调用add.delay
在worker中启动一个异步任务,并立即returns AsyncResult
object。如果要访问任务的实际 return 值,则需要调用 AsyncResult.get()
。这将阻塞,直到任务在 worker 中完成。
return_value = add.delay(count.x).get()
documentation 中有更多详细信息。
芹菜不适合这个。
您尝试做的事情可能会通过纯 js 甚至 ajax django 视图来实现。
您可以在 js 中使用计时器对服务器进行异步调用并每 3 秒询问一次当前值。然后,您应该相应地更新 html,使用 js 甚至 JQuery。
查看 Django REST Framework。使用对服务器的异步调用非常方便。
芹菜有什么用
Celery 适用于繁重的后台任务,可以由不同的机器或异步执行,以便请求不会在高处理时间时超时或更好地管理资源。它不会做任何与您的模板渲染相关的事情,因为它主要是一个任务队列实用程序。