Python Celery , 定时任务 crontab介绍
简介:什么是 Celery
Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。
我们通常使用它来实现异步任务(async task)和定时任务(crontab)
大致原题图
-
Celery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。
-
Celery Worker:执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。
-
Broker:消息代理,或者叫作消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理,但适用于生产环境的只有RabbitMQ和Redis)。
-
Producer:调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
-
Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。
选择消息代理
Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理,但适用于生产环境的只有RabbitMQ和Redis,至于其他的方式,一是支持有限,二是可能得不到更好的技术支持。
基本配置:
BROKER_URL : 指定以什么方式作为消息代理
CELERY_RESULT_BACKEND: 结果存储方式
CELERY_TASK_SERIALIZER: 任务序列化和反序列化方案
CELERY_RESULT_SERIALIZER: 结果序列化
CELERY_ACCEPT_CONTENT: 读取数据可接受的 数据格式
实例化一个 Celery
celery = Celery(’name’, broker=‘’, backend=‘’)
定时任务,或者异步执行的任务,需要使用 celery.task() 装饰器方法 其中 celery 是你实例化的一个 Celery 对象
启动worker:
启动worker 需要保证 消息中间件启动成功, (目前公司测试平台使用 redis 作为消息中间件:需要保证 redis 启动,且端口是 配置的端口)
redis 配置 在 redis 根目录下的 redis.conf
celery -A project -l info -f /data/logs/xx.file
project : celery 实例, 需要指定路径(当前路径不需要指定目录路径)
-l: --loglevel=INFO
-f: --logfile=文件路径 不指定就默认当前路径输出
上面只是启动了 异步任务的 消费者,我们在开发过程中如何手动触发这个异步任务的发送方呢?
Ipython 使用技巧
异步任务调用,使用 delay() 才会将发送消息发送到消息中间件 broker中
启动定时任务调度:
celery -A project beat -l info
目前我们定时任务调度使用的是 crontab 模块
调用异步任务:
task.delay() 才会将异步任务发送到消息中间件去消费
task.applyasync
以上两种方法 适用于 已经被注册的异步任务
app.send_task(’tasks.add’, args=[3,4]) 适用于未被注册的异步任务。
celery.schedules crontab模块使用
每分钟执行一次
c1 = crontab()
每天凌晨十二点执行
c2 = crontab(minute=0, hour=0)
每十五分钟执行一次
crontab(minute=’*/15’)
每周日的每一分钟执行一次
crontab(minute=’’,hour=’’, day_of_week=‘sun’)
每周三,五的三点,七点和二十二点没十分钟执行一次
crontab(minute=’*/10’,hour=‘3,17,22’, day_of_week=‘thu,fri’)
更多请参见:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#crontab-schedules