Python Celery , 定时任务 crontab介绍

时间:2024-05-19 20:53:19

Python Celery , 定时任务 crontab介绍

简介:什么是 Celery

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。
我们通常使用它来实现异步任务(async task)和定时任务(crontab)

大致原题图

Python Celery , 定时任务 crontab介绍

  1. Celery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。

  2. Celery Worker:执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。

  3. Broker:消息代理,或者叫作消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理,但适用于生产环境的只有RabbitMQ和Redis)。

  4. Producer:调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。

  5. 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=文件路径 不指定就默认当前路径输出

Python Celery , 定时任务 crontab介绍
上面只是启动了 异步任务的 消费者,我们在开发过程中如何手动触发这个异步任务的发送方呢?

Ipython 使用技巧

Python Celery , 定时任务 crontab介绍
异步任务调用,使用 delay() 才会将发送消息发送到消息中间件 broker中

启动定时任务调度:

celery -A project beat -l info

目前我们定时任务调度使用的是 crontab 模块
Python Celery , 定时任务 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