03-Python 框架 Celery
celery
简述 celery 是什么以及应用场景?
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 |
|
简述 Celery 多任务结构目录
1 |
|
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/