介绍
• 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。
• 单个 Celery 进程每分钟可处理数以百万计的任务。
• 通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调。
总体架构
Celery的架构由消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)三部分组成。
消息中间件
Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成,包括RabbitMQ,Redis,MongoDB等
任务执行单元
Worker是celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。
任务结果存储
Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP,redis,memcached,mongodb,SQLAlchemy,Django等
注册任务
import os
from celery.app import Celery
# 设置Django环境,告诉celery当前是Django项目;项目名字.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo_market.settings')
# 2 创建celery对象,这里我一般同一台服务器部署同一个项目时会使用项目的名字避免冲突;celery_tasks包名字
app = Celery('celery_tasks')
# 3 设置 broker
app.config_from_object("celery_tasks.config");celery_tasks包名字.配置文件
# 4celery自动检测任务 这里会自动去celery_tasks.sms下找tasks.py
app.autodiscover_tasks(['celery_tasks.sms'])
特别注意:
在同一台服务器做新旧迁移的时候,使用celery要特意区分出Celery('celery_tasks')的名字,
还有celery_tasks.config文件里面的redis的消息接收和结果的队列不要和已经使用的celery监控的对象一致。如果一致了会被其他的celery消费。
启动
celery -A celery_tasks.main worker -l info #这是linux的命令
-A指对应的应用程序, 其参数是项目中 Celery实例的位置。
worker指这里要启动的worker。
-l指日志等级,比如info等级
windows启动celery 需要加参数,用如下命令启动服务
celery -A celery_tasks.main worker -l info --pool=solo
或者
celery -A celery_tasks.main worker -l info -P eventlet
定时任务
Scheduler(定时任务,周期性任务)
一种常见的需求是每隔一段时间执行一个任务
在celery中执行定时任务非常简单,只需要设置celery对象的CELERYBEAT_SCHEDULE属性即可。
配置如下 config.py
from __future__ import absolute_import
BROKER_URL = "redis://localhost:6379/0"
CELERY_BACKEND_URL = "redis://localhost:6379/1"
CELERY_TIMEZONE = "Asia/Shanghai"
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
'add-every-30-seconds':{
'task':'proj.tasks.add',
'schedule':timedelta(seconds=30),
'args':(16, 16)
},
}
注意配置文件需要指定时区,这段代码表示每隔30秒执行add函数,一旦使用了scheduler,启动celery需要加上-B参数。
celery -A proj worker -B -l info