django-celery实现定时任务和异步任务消息队列
废话不多说,celery主要功能就是执行异步任务和延期或者定时执行任务,比如在项目中用到发送邮件,短信之类的,我们为了不让用户等待,先返回给用户,告诉他《发送成功》,然后将任务放到任务队列中执行,这时候celery就很强大了。
一:异步任务:
安装第三方插件:
pip install redis #这里celery消息队列代理用,也可以直接舒勇django,下面有介绍 pip install django-celery #这个就不多说了 pip install flower #提供消息队列界面UI
创建django项目:
django-admin.py startproject celery_test
创建app:
python manange.py startapp kecelety
在新建的app下面增加以下代码
django中使用celery 任务AppRegistryNotReady: Apps aren't loaded yet.添加
import django django.setup()
tasks.py(这个文件名称不允许修改,只能是这个):
import django
django.setup()
import celery import task
import time
@task
def say_hello():
#主要是为了测试异步功能,让他休眠5秒再打印,这样就避免打印和views.py中的返回同时执行,
#其实是异步执行,为了肉眼效果就加上休眠
time.sleep(5)
print "****************"
return 0
views.py:(默认配置好了url,不会配置的请百度)
from django.http import HttpResponse
from .tasks import say_hello
import json
def hello(request):
#添加到消息队列中
r = say_hello.delay()
#执行成功返回True
print r.ready()
print r.successful()
return HttpResponse(json.dumps({'data':'ddd'}))setting.py配置:
INSTALLED_APPS = ( 'kecelery', 'djcelery', 'kombu.transport.django' #配合下面的BROKER_URL使用 ) import djcelery djcelery.setup_loader() CELERY_TIMEZONE = 'Asia/Shanghai' #避免定时任务执行的时候不按照正确时间执行 #息队列界面UI中可以看到 BROKER_URL = 'redis://127.0.0.1:6379/0' #设置redis为celery代理 #设置django为celery代理,此时任务消息存储在数据库中,在admin中注册即可在后台看到 #admin.py: #from kombu.transport.django import models as kombu_models #admin.site.register(kombu_models) #BROKER_URL = 'django://' CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' #定时任务用到
执行:
我们不能一味的依靠增加额外的worker来提高性能, 因为每个worker都会占用一定的资源. 一般都是多少CPU便创建多少worker, 并为每个worker创建一个新的进程. 设置的太高则会很快的榨干服务器的CPU和内存资源,下面就是创建了4个 python manage.py celery worker -c 4 --loglevel=info python manage.py runserver 0.0.0.0:9004 python manage.py celery flower
访问192.168.1.153:9004/c/hello/,出现
5秒后出现下图(由于上面休眠了5秒,这里能看出来先返回了数据给用户,然后执行任务):
flower界面:
后台admin界面说明: