Celery 分布式任务队列
Celery 分布式任务队列:
不管是使用什么编程语言,使用什么框架。在服务器上执行耗时操作,比如网络请求、视频转码、图片处理等。如果想实现快速响应客户端的需求,则必须使用任务队列。任务队列是一个单独的程序,和网站没有直接关系,任务队列提供了接口,能在网站中通过代码操作任务队列,比如:添加任务,查看任务结果等
Celery 是一个简单、灵活、可靠的分布式系统,用于处理大量消息,同时提供维护此类系统所需的工具。它是一个专注于实时处理的任务队列,同时也支持任务调度。
Celery支持手动发布任务,也支持定时任务。不管任务从哪里来,会先把任务存放到Broker(中间人)中,常用作Celery
Broker的有Redis、RabbitMQ、数据库等,其中Redis和RabbitMQ的稳定性和效率是最高的。接着Celery会生成worker,来从Broker中读取任务执行。执行完成后,再把执行后的结果存放到Backend中,常用作Celery
Backend的有Redis和数据库。
Celery官方推荐的Broker和Backend搭配为:RabbitMQ(Baoker)+Redis(Backend)。我们平常一台服务器上运行Redis和RabbitMQ有点太浪费了,而且RabbitMQ只有在消息非常大的时候才能体现优势,因此一般我们直接使用Redis作为Broker和Backend即可
。
Flask中使用Celery:
Celery和Redis都安装成功后,就可以在Flask中集成Celery了。当然Flask官方文档也描述了如何集成Celery,但是那种方式不适合现实中大型项目结构的,很容易引起循环引用的问题。这里我的源码结构如下:
1 | |- project |
其中和celery有关系的文件如下:
mycelery.py:创建celery对象,并且添加了任务。
app.py:对celery进行app绑定。
views.py:调用celery中的任务。
启用 celery服务
1
celery -A app.celery worker --loglevel=info -P gevent
其中的celery -A是固定写法,app代表我的app.py模块,celery代表我的app.py中的celery对象,—loglevel代表日志级别,如果在windows上,还需要使用-P
gevent参数,并且需要通过pip安装gevent库。以上即成功运行了Celery,我们访问发送邮件的URL(/mail),即可成功使用celery异步发送邮件了。
app.celery
是根据app.py中的是实例对象定义的名字
通过celery实现操作速度更加快捷