(一)celery框架简介
Celery 是一个简单的,灵活的,可靠的python编写处理大量消息的分布式系统。
分布式:就是将任务分发个多个客户端进行处理的模式。通常在python当中使用的分布式有两种:
1、redis分布式,利用redis广告模式进行分布式
2、使用celery进行分布式
分布式开发,一定涉及一个设计模式:生产消费者模式
Celery 基本原理:
使用celery需要的组件
1、pip install celery
2、需要消息队列
1、rabbitmq 消息队列
2、Redis
3、其他数据库
在整个celery开发的过程当中知道要有存放任务的容器,这个容器可以是redis数据库,可以是其他数据库,还可以是rabbitmq消息队列。如果任务有结果还需要设置一个容器来存放结构。
原理:
使用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
在settings中配置celery配置
代码如下
#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
app的名称必须和配置文件形同
在项目的主目录下编写celery控制文件
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
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之后python manage.py会多出很多命令
如图:
现在启动项目需要启动两个服务
启动Django项目
启动Django-celery服务
启动celery之前需要启动redis数据库
启动redis数据库
然后启动celery
命令: python manage.py celery worker --loglevel=info
在视图当中触发一下celery任务
Celery的任务需要用delay函数触发
在视图中触发任务
启动任务命令delay()
在路由中指出
如图访问不会有结果
在celery中执行成功