本篇文章主要是由于计划使用django写一个计划任务出来,可以定时的轮换值班人员名称或者定时执行脚本等功能,百度无数坑之后,终于可以凑合把这套东西部署上。本人英文不好,英文好或者希望深入学习或使用的人,建议去参考官方文档,而且本篇的记录不一定正确,仅仅实现crontab 的功能而已。
希望深入学习的人可以参考http://docs.jinkan.org/docs/celery/。
首先简单介绍一下,Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。它的架构组成如下图
可以看到,Celery 主要包含以下几个模块:
任务模块 Task
包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。
消息中间件 Broker
Broker,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。
任务执行单元 Worker
Worker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。
任务结果存储 Backend
Backend 用于存储任务的执行结果,以供查询。同消息中间件一样,存储也可使用 RabbitMQ, Redis 和 MongoDB 等。
异步任务
使用 Celery 实现异步任务主要包含三个步骤:
- 创建一个 Celery 实例
- 启动 Celery Worker
- 应用程序调用异步任务
一、快速入门
本地环境:
- OS:centOS6.5
- django-1.9
- python-2.7.11
- celery==3.1.20
- django-celery
python、pip、django相关安装不在详写,直接参考百度即可;
pip install django==1.9 安装django pip install celery==3.1.20 安装celery pip install django-celery 安装django-celery
安装如果有失败,所需要的依赖环境自行解决。例如:mysql-python等;
使用做redis作为消息中间件,安装redis:https://www.gaodaima.com/article/96230.htm
二、创建django项目开始测试
1、创建django 工程 命名为djtest
django-admin.py startproject djtest1
2、创建app 本文来源gaodaimacom搞#代%码@网-命名为apps
cd djtest python manage.py startapp apps1
3、创建完成后,django 目录结构如下:
djtest1 ├── apps1 │ ├── admin.py │ ├── apps.py │ ├── init.py │ ├── migrations │ │ └── init.py │ ├── models.py │ ├── tests.py │ └── views.py ├── djtest1 │ ├── init.py │ ├── init.pyc │ ├── settings.py │ ├── settings.pyc │ ├── urls.py │ └── wsgi.py └── manage.py
4、修改setting.py django配置文件,增加如下:
import djcelery ### djcelery.setup_loader() ### CELERY_TIMEZONE='Asia/Shanghai' #并没有北京时区,与下面TIME_ZONE应该一致 BROKER_URL='redis://192.168.217.77:16379/8' #任何可用的redis都可以,不一定要在django server运行的主机上 CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' ### INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'djcelery', ### 加入djcelery应用 'apps1', ### 加入新创建的apps1 ) TIME_ZONE='Asia/Shanghai' ###