(一)celery框架简介

            Celery 是一个简单的,灵活的,可靠的python编写处理大量消息的分布式系统。

            分布式:就是将任务分发个多个客户端进行处理的模式。通常在python当中使用的分布式有两种:

           1、redis分布式,利用redis广告模式进行分布式

           2、使用celery进行分布式

           分布式开发,一定涉及一个设计模式:生产消费者模式

     Celery 基本原理:

celery连接Redis原理 celery redis集群_django


  使用celery需要的组件

  1、pip install celery

  2、需要消息队列

    1、rabbitmq 消息队列

    2、Redis

    3、其他数据库

 在整个celery开发的过程当中知道要有存放任务的容器,这个容器可以是redis数据库,可以是其他数据库,还可以是rabbitmq消息队列。如果任务有结果还需要设置一个容器来存放结构。

原理:

celery连接Redis原理 celery redis集群_redis_02


celery连接Redis原理 celery redis集群_redis_03


使用django-celery+redis进行异步任务处理

  安装包:

  pip install django-celery=3.2.2

  pip install django-redis=4.10.0

  pip install redis==2.10.6

  pip install flower #可视化平台

  配置settings

  注册app

  

celery连接Redis原理 celery redis集群_数据库_04


  在settings中配置celery配置

  

celery连接Redis原理 celery redis集群_celery连接Redis原理_05


  

代码如下

#celery
import djcelery #导入django-celery
djcelery.setup_loader()#进行模块加载
BROKER_URL = 'redis://127.0.0.1:6379/1'  #任务容器地址,redi数据库
CELERY_IMPORTS = ('CeleryTask.tasks')    #具体的任务文件
CELERY_TIMEZONE = 'Asia/Shanghai'        #clery时区
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'   #celey处理器,固定

 #celery 的定时器
from celery.schedules import crontab
from celery.schedules import timedelta

CELERYBEAT_SCHEDULE = {  #定时器策略
    #定时任务一:没30秒运行一次
    u"测试定时器1":{
        'task':'celeryTask.tasks.taskExample',
        'schedule':timedelta(seconds=30),
        'args':(),
    },
}

因为启动任务需要告诉celery到哪里去拿异步任务所以给celery创建独立的app

celery连接Redis原理 celery redis集群_redis_06


app的名称必须和配置文件形同

celery连接Redis原理 celery redis集群_django_07


在项目的主目录下编写celery控制文件

celery连接Redis原理 celery redis集群_redis_08

from __future__ import absolute_import,unicode_literals
import os
from celery import Celery
from django.conf import settings

# 设置celery执行的环境变量,执行django项目的配置文件
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CeleryTask.settings")

#创建celery应用
app = Celery('art_project') #celery应用的名称
app.config_from_object('django.conf:settings') #加载的配置文件

#如果在工程的应用中创建了tasks.py模块,那么Celery应用就会自动去检索创建的任务。比如你添加了一个任#务,在django中会实时地检索出来。
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)

在celeryapp下编写任务文件,文件名必须是task.py

celery连接Redis原理 celery redis集群_celery连接Redis原理_09

from __future__ import absolute_import
from FreshShop.celery import app #在成功安装celery之后,django新生成的模块

@app.task #taskExapmle被app.task装饰过的就是异步任务
def taskExample():
   print('send email ok!')

@app.task
def add(x=1, y=2):
   return x+y

因为我们安装了djcelery app,所以,我们需要同步数据库

celery连接Redis原理 celery redis集群_django_10


效果如下

celery连接Redis原理 celery redis集群_django_11


当配置完成celery之后python manage.py会多出很多命令

如图:

celery连接Redis原理 celery redis集群_django_12


现在启动项目需要启动两个服务

启动Django项目

启动Django-celery服务

启动celery之前需要启动redis数据库

启动redis数据库

celery连接Redis原理 celery redis集群_django_13


然后启动celery

命令: python manage.py celery worker --loglevel=info

在视图当中触发一下celery任务

Celery的任务需要用delay函数触发

celery连接Redis原理 celery redis集群_数据库_14


在视图中触发任务

celery连接Redis原理 celery redis集群_数据库_15


启动任务命令delay()

celery连接Redis原理 celery redis集群_数据库_16


在路由中指出

celery连接Redis原理 celery redis集群_celery连接Redis原理_17


如图访问不会有结果

celery连接Redis原理 celery redis集群_celery连接Redis原理_18

在celery中执行成功

celery连接Redis原理 celery redis集群_数据库_19