Celery配置及使用
一、简介
作为分布式任务平台的基本框架,Celery 是由 Python 语言开发的。Celery 本身不是任务队列,是管理分布式任务队列的工具,它封装了操作常见任务队列的各种操作。我们使用它可以快速进行任务队列的使用与管理。本文主要说明如何更规范的配置和管理任务。
更详细的技术文档,请访问官网 http://www.celeryproject.org/。
二、一些概念
在使用 Celery 之前请务必理解以下概念:
a. Celery Beat: 任务调度器,Beat 进程会读取配置文件的内容,周期性的将配置中到期需要执行的任务发送给任务队列
b. Celery Worker: 执行任务的消费者,通常会在多台服务器运行多个消费者来提高运行效率。
c. Broker: 消息代理,也是任务队列本身(通常是消息队列或者数据库),通常称为消息中间件,接收任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方。
d. Producer: 任务生产者,调用 Celery API 的函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
三、配置项说明
Celery 是通过配置文件中的配置项来定制任务的。
CELERY_IMPORTS: 配置导入哥哥任务的代码模块
CELERY_QUEUES: 定义任务执行的各个任务队列(如按照执行时间分slow、fast等),默认有一个队列,暂称为一般任务队列。
CELERY_ROUTES: 配置各个任务分配到不同的任务队列
CELERY_SCHEDULE: 配置各个任务执行的时机参数
CELERY_TIMEZONE: 设置时区
CELERY_ENABLE_UTC: 是否启动时区设置,默认值是True
CELERY_CONCURRENCY: 并发的worker数量
CELERY_PREFETCH_MULTIPLIER: 每次去消息队列读取任务的数量,默认值是4
CELERY_MAX_TASKS_PRE_CHILD: 每个worker执行多少次任务后会死掉
BROKER_URL: 使用redis作为任务队列
CELERY_TASK_RESULT_EXPIRES: 任务执行结果的超时时间
CELERY_TASK_TIME_LIMIT: 单个任务运行的时间限制,超时会被杀死,不建议使用该参数,而用CELERY_TASK_SOFT_TIME_LIMIT
CELERY_RESULT_TACKEND: 使用redis存储执行结果
CELERY_TASK_SERIALIZER: 任务序列化方式
CELERY_RESULT_SERIALIZER: 任务执行结果序列化方式
CELERY_DISABLE_RATE_LIMITS: 关闭执行限速
四、实用中的目录结构
background
|---celery_task
|----daemons
|----day
|----hour
|----minute
|----week
|----test
|----test.py
|----CeleryConfig.py # 配置文件
|----__init__.py # 定义celery任务的名称及配置文件位置
五、简要配置
__init__.py内容:
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 # by MR 4 5 from celery import Celery 6 7 app = Celery("MyCelery") 8 app.config_from_object("background.celery_task.CeleryConfig")
CeleryConfig.py 内容:
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 from celery.schedulers import crontab 5 from kombu import Exchange, Queue 6 7 BROKER_URL = "redis://127.0.0.1:6379/10" 8 CELERY_RESULT_BACKEND = "redis://127.0.0.1:6379/11" 9 CELERY_TASK_SERIALIZER = "json" 10 CELERY_RESULT_SERIALIZER = "json" 11 CELERY_TSKK_RESULT_EXPIRES = 60 * 60 * 24 * 3 12 CELERY_ACCEPT_CONTENT = ["json"] 13 CELERY_TIMEZONE = "Asia/Shanghai" 14 15 CELERY_CONCURRENCY = 20 16 CELERY_MAX_TASK_PER_CHILD = 100 17 CELERY_TASK_SOFT_TIME_LIMIT = 300 18 CELERY_DISABLE_RATE_LIMITS = True 19 20 21 CELERY_IMPORTS = ( 22 "background.celery_task.test.TestTask", 23 ) 24 25 CELERY_QUEUES = ( 26 Queue('task_slow', exchange=Exchange('task_slow'), routing_key='task_slow'), 27 ) 28 29 CELERY_ROUTES = { 30 'background.celery_task.test.TestTask.test': {'queue': 'task_slow, 'routing_key': 'task_slow'}, 31 } 32 33 34 CELERYBEAT_SCHEDULE = { 35 '1_minute_test_task_test': { 36 'task': 'background.celery_task.test.TestTask.test', 37 'schedule': crontab(minute='*/1') 38 'args': (), 39 } 40 }
test.py的内容:
#!/usr/bin/python # -*- coding: utf-8 -*- import random
from background.celery_task import app app.task(soft_time_limit=300) def test(): a = random.randint(1, 10) b = random.randint(20, 30) print ("%(a)s+%(b)s=%(c)s" % {"a": a, "b":b, "c": a+b}) print 'OK'
六、Celry启动
安装一个叫flower的webui,提供任务查询,worker生命管理,以及路由管理等(底层是通过tornado框架封装的)
flower -A background.celery_task --loglevel=info --url-prefix=task_manager --basic_auth=celery:celerywd --log_file_prefix=~/MR/celery/flower.log >/dev/null 2>&1 &
celery -A background.celery_task worker -Q celery -f ~/MR/celery/celery.log --loglevel=info --beat >/dev/null 2>&1 &
七、demo地址