场景一:公司准备给全部员工推送一个邮件公告。采用封装的邮件库API,使用一次循环遍历全部员工推送邮件,会使主程序卡在循环处无法响应,这是我们不愿意看到的,我们希望点击执行之后,可以正常其他操作。场景二,量化程序的本地回测数据库每天都要更新。写个程序每天执行一次,是可以的,但不是有效率的,同时也会因为人而引入不确定因素。我们希望能每天定时执行一个操作,或者每小时执行一个操作,有效、可靠。这里归纳起来就是两类需求:异步任务和定时任务。
1. 什么是Celery
Celery 是一个基于 Python 编写的分布式任务调度模块,同时也支持实时处理的任务队列。
2. Celery工作原理

Celery 的原理是利用了一个任务队列,将任务写入队列中,然后一个一个取出来执行并将结果写入指定数据库。理解起来就是生产者-消费者模型。在django中,执行异步任务代码产生一个task消息,传递给 broker,而后 celery 的 worker 会获取到 task 消息,对 task 执行,最后将执行返回的消息和结果存储在 backend 中。这里的 broker 和 backend 通常使用的是 rabbitMq 或redis。
2.1 Pruducer
负责产生任务,然后交给任务队列去处理。有两种生产者,一种是上面提到的django,也就是主程序,这种任务放入队列之后马上会被执行;另外一种是任务调度器–celery beat,它读取配置文件的内容,周期性的将任务请求发送给任务队列,这样就满足了定时任务的需求。
2.2 Celery worker
执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率
2.3 Celery序列化
在客户端和消费者之间传输数据需要序列化和反序列化,主要有pickle、json、yaml、msgpack方案,其中的pickle由于安全问题从3.2的版本开始不被支持。
3. 构建一个Celery任务
3.1 基本安装