为什么要使用Celery
- 我们在做网站后端程序开发时,会碰到这样的需求:用户需要在我们的网站填写注册信息,我们发给用户一封注册激活邮件到用户邮箱,如果因为各种原因,这封邮件发送所需要时间较长,那么客户将会等待很久,造成不好的用户体验
解决方法如下
- 我们将耗时任务放到后台异步执行。这就不会影响用户的取他操作。
- 如何实现异步执行任务呢?我们可以使用celery.celery除了刚涉及到的异步执行任务之外,还可以实现定时处理某些任务。
Celery介绍
- celery时一个功能完备即插即用的任务队列
- 它使得我们不需要考虑复杂的问题,使用非常简单。
- celery看起来似乎很庞大,现在先对其进行简单的了解,然后再去学习其他一些高级的特性。
- celery使用异步处理问题,当发送邮件或者文件上传或图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。
Celery的特点
- 简单:易于使用和维护,有丰富的文档
- 高效:单个celery进程每分钟可以处理百万个任务
- 灵活:celery中几乎每个部分都可以自定义扩展
Celery非常易于集成到一些web开发框架中
- 任务队列时一种跨线程、跨机器工作的一种机制
- 任务队列中包含称作任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理。
- celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者)。clients发出消息到队列中,broker将队列中的信息派发给worker来处理。
- 一个celery系统可以包含很多的worker和broker,可增强横向护展性和高可用性。
Celery核心概念
- 作为中间人有两种方案可选择:RabbitMQ、Redis。
- 下面我们介绍使用Redis
安装Celery
# 最好是安装到你项目所使用的虚拟环境下
pip install celery
先来配置任务的发出者(client)和中间人(redis服务器)
创建celery()对象:
- 创建一个包目录和在这个包目录中创建一个文件:这些名字时不固定的
- 启动redis服务器,使用它作为中间人
- Celery()中的第一个参数是所在包的名字.py文件的名字,也可以换成别的,不过一般都是写导包的路径;第二个参数是指定中间人,8代表所使用的数据库的编号:将前面写好的发送邮件的代码复制过来,并进行修改:
- 使用@app.task进行装饰,装饰以后,它就有一个delay()方法了,这个方法可以将任务放入任务队列,进行异步执行
使用delay()方法
任务的处理者
- 现在有任务的发出者(也就是上面红色线框的代码),也有中间人(redis服务器),还差任务的处理者,这三者是缺一不可的;
- 任务的发出者,中间人,人物的处理者可以在同一台电脑上启动,也可以不在同一台电脑上;
- 处理者这一段是需要有任务的代码。
现在我们使用两台电脑
- 打开Linux电脑,将现在写好的项目源文件,上传到Linux系统中:
- 因为我们要在ubuntu中进行任务的处理工作;所以,ubuntu中必须要有运行项目所需要的环境
- 先把windows项目中安装的各种包进行打包
通过软件(FileZilla Client)把项目传到Ubuntu系统中
安装项目运行所需要的包
- cd到文件rr.txt所在的目录
- 在输入命令
pip install-r rr.txt
下面还需要配置一个东西
-
在启动项目的时候应该初始化settings中相关的配置信息
-
在windows下启动项目的时候Django已经给我们做了初始化
-
但是处理者(worker)在处理的时候()ubuntu需要用到settings文件中的配置;但是,我们在启动处理者的时候并没有初始化django的settings相关的配置信息。
-
下面来配置ubuntu中项目的初始化(注意:这些代码在启动任务的处理者电脑上才需要,而任务的发出者也就是在启动Django项目的时候是不需要的。)
设置成功以后下面就是启动任务处理者
启动任务处理者命令如下:
celery -A celery_tasks.tasks worker -l info
- -A 后面跟着的是我们创建包里面的py文件
- -l 表示信息展示的是info级别,也就是日志的信息级别,也就是输出任务的相关信息
发送邮件成功是这样的
celery使用流程小结
- 如果任务的发出者,中间人还有任务的处理者,不再同一台电脑上的话,这三者之间必须要能进行通信,也就是说需要在同一个网段,而且处理者所在的电脑必须要能上网,否则它也给163的邮箱发不出去。