03-Python 框架 Celery

celery

简述 celery 是什么以及应用场景?

https://blog.csdn.net/fenglepeng/article/details/104481808

celery 是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程,如 Eventlet,gevent 等,它们能被并发地执行在单个或多个职程服务器(worker servers)上。任务能异步执行(后台运行)或同步执行(等待任务完成)。

在生产系统中,celery 能够一天处理上百万的任务。

组件介绍

  • Producer:调用了 Celery 提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
  • Celery Beat:任务调度器,Beat 进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。
  • Broker:消息代理,又称消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(通常是消息队列或者数据库)。Celery 目前支持 RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper 等作为消息代理,但适用于生产环境的只有 RabbitMQ 和 Redis, 官方推荐 RabbitMQ。
  • Celery Worker:执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。
  • Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery 默认已支持 Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy 等方式。

工作原理:

它的基本工作就是管理分配任务到不同的服务器,并且取得结果。至于说服务器之间是如何进行通信的?

这个 Celery 本身不能解决。所以,RabbitMQ 作为一个消息队列管理工具被引入到和 Celery 集成,负责处理服务器之间的通信任务。和 Rabbitmq 的关系只是在于,Celery 没有消息存储功能,他需要介质,比如 rabbitmq、redis、mysql、mongodb 都是可以的。推荐使用rabbitmq,他的速度和可用性都很高。

Celery 如何实现定时任务?

启用 Celery 的定时任务需要设置 CELERYBEAT_SCHEDULE。

CELERYBEAT_SCHEDULE='djcelery.schedulers.DatabaseScheduler'

每 30 秒调用 task.add

1
2
3
4
5
6
7
8
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
'add-every-30-seconds': {
'task': 'tasks.add',
'schedule': timedelta(seconds=30),
'args': (16, 16)
},
}

简述 Celery 多任务结构目录

1
2
3
4
5
6
pro_cel
├── celery_tasks # celery相关文件夹
│ ├── celery.py # celery连接和配置相关文件
│ └── tasks.py # 所有任务函数
├── check_result.py # 检查结果
└── send_task.py # 触发任务

Celery 中装饰器 @app.task@shared_task 的区别?

一般情况使用的是从 celeryapp 中引入的 app 作为的装饰器:@app.task

django 那种在 app 中定义的 task 则需要使用 @shared_task

celery worker 的并发数量

并发的 worker 数量,也是命令行-c指定的数目

不是 worker 数量越多越好,保证任务不堆积,加上一些新增任务的预留就可以了,一般设置为 CPU 的核数。

配置文件设置CELERYD_CONCURRENCY = 20


03-Python 框架 Celery
https://flepeng.github.io/interview-20-开发语言类-21-Python-03-Python-框架-Celery/
作者
Lepeng
发布于
2020年8月8日
许可协议