Celery
cnblogs.com/forward-wang/p/5970806.html
Celery的设计初衷,主要就是用来处理并发问题的
Celery主要适用于两大类场景:
1 异步:
有的任务执行时间较长,你不想让程序一直等待结果返回,可以先将改任务放入celery任务队列中,并从Celery获取一个任务ID。后续通过询问Celery来得知任务执行状态和进度。
2 定时:
需要定时执行同样的任务,Celery任务队列支持定时触发,可以按照时间间隔或者crontab表达式来触发任务。
Celery具有以下优点:
1 Simple(简单)
Celery 使用和维护都非常简单,并且不需要配置文件
2 Highly Available(高可用)
woker和client会在网络连接丢失或者失败时,自动进行重试。并且有的brokers 也支持“双主”或者“主/从”的方式实现高可用。
3 Fast(快速)
单个的Celery进程每分钟可以处理百万级的任务,并且只需要毫秒级的往返延迟(使用 RabbitMQ, librabbitmq, 和优化设置时)
4 Flexible(灵活)
Celery几乎每个部分都可以扩展使用,自定义池实现、序列化、压缩方案、日志记录、调度器、消费者、生产者、broker传输等等。
工作原理:
产生数据的模块(客户端),就形象地称为生产者;而处理数据的模块(服务端),就称为消费者。
![](https://pic4.zhimg.com/80/v2-a899d56864ed2dca4ef96ebbea6be674_720w.jpg?source=3af55fa1)
生产者和消费者彼此之间不直接通讯,而通过消息队列(缓冲区)来进行通讯。所以生产者生产完数据之后不用等待消费者处理,直接扔给消息队列,消费者不找生产者要数据,而是直接从消息队列里取,消息队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个消息队列就是用来给生产者和消费者解耦的。
具体的:
客户端:下发任务(耗时操作)==》代理人:接收通知,将任务加入队列==》工人:监听队列,从队列中读取任务,执行新线程
![](https://pic1.zhimg.com/80/v2-6250ea009e28f1cad256d209f4f2ae9a_720w.jpg?source=3af55fa1)
概念:
任务task:耗时的函数,如云通信发短信
代理人broker:接收通知,将任务加入队列
队列queue:存储任务的地方==>redis存函数的名称
工人work:监听队列,从队列中读取任务,执行新线程
调用:函数.delay(参数)