您的位置:首页 > 编程语言 > Go语言

django学习笔记7:django和celery实现异步

2016-06-30 22:27 489 查看
django和celery实现异步:
首先安装:
pip install celery 
pip install django-celery
pip install django-kombu

修改mytest\mytest\settings.py
在开头添加:
import djcelery
djcelery.setup_loader()
BROKER_URL='django://'

INSTALLED_APPS = [
..........
'djcelery',
"kombu.transport.django",
]

最后创建Celery所需的数据表, 运行:
python manage.py migrate



在mytest\test1\下添加tasks.py
#coding:utf-8
import time
from celery.task import task

import django
django.setup()

@task
def _do_kground_work(name):
print name
time.sleep(5)
wenidow下要添加:
import django
django.setup()
不然会报app未加载的错误
这里是创建一个任务,简单的打印字符串

修改mytest\test1\views.py
新增以下内容:
from .tasks import _do_kground_work

def hello(request):
_do_kground_work.delay('GreenPine')
return HttpResponse('Hello, World!!!!!')
导入自定义的任务,延时执行任务,先出现HttpResponse里的内容

修改mytest\test1\urls.py
添加:
url( r'^hello/$',test1_views.hello,name='hello') ,

先到项目中启动django服务,python manage.py runserver 或者 masge.py runserver 
再打开一个终端,进入项目,python manage.py celery worker --loglevel=info 或者 manage.py celery worker --loglevel=info

浏览器进入127.0.0.1:8000/hello/
浏览器显示:



浏览器没刷新一次,就会在 worker终端出现'GreenPine'字符串,但是页面始终是hello world!!!!



通过任务调度实现异步

django和celery再具体一点的实现:
修改mytest\test1\tasks.py
#coding:utf-8
import time
from celery.task import task

import django
django.setup()

@task
def _do_kground_work(name):
for u in range(10):
time.sleep(1)
print name
time.sleep(5)


修改mytest\test1\forms.py
新增以下内容:
class AddHello(forms.Form):
t = forms.IntegerField()


修改mytest\test1\views.py
from .forms import AddForm,AddHello

def to_hello(request):
form = AddHello()
return render(request,'to_hello.html',{'form':form})

def hello(request):
if request.method =='POST':
form = AddHello(request.POST)
if form.is_valid():
t = form.cleaned_data['t']
_do_kground_work.delay('GreenPine'+str(t))
return render(request,'hello.html',{'t':t})


新增mytest\test1\templates\to_hello.html
 
<form  action={% url 'hello' %} method="post">
{% csrf_token %}
{{ form}}
<input type="submit" value="OK">
</form>

新增mytest\test1\templates\hello.html
<a href="{% url 'to_hello' %}">to_hello</a>
{{t}} hello world


修改urls.py
url( r'^to_hello/$',test1_views.to_hello,name='to_hello'),

先到项目中启动django服务,python manage.py runserver 或者 masge.py runserver 
再打开一个终端,进入项目,python manage.py celery worker --loglevel=info 或者 manage.py celery worker --loglevel=info

浏览器进入127.0.0.1:8000/to_hello/
浏览器显示:



输入数字后跳转到hello页面



worker终端显示:



数据都传过来了,再点击to_hello回到to_hello页面,再输入数字,就这样一直循环动作看着worker终会发现celery的任务是排队的,等前一个完成后再进行下一个

这里可以看出来celery和django实现异步其实是通过两个服务完成
django将一个需要长时间等待才能完成的任务扔给了celery的服务,然后自己继续执行,这样在页面上就感觉是异步完成
而celery收到任务以后还是扔到一个列队里,每个任务排队一个一个的执行
不过我试了一下很频繁的多次扔任务会报错,然后celery得服务会停掉,难道是我手速太快了???
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: