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界面说明: