除了redis,还可使用另一个神器----Celery。Celery是一个异步任务的调度工具。html
Celery是Distributed Task Queue,分布式任务队列,分布式决定了能够有多个worker的存在,列表表示其是异步操做,即存在一个产生任务提出需求的工头,和一群等着被分配工做的码农。python
在python中定义Celery的时候,咱们要引入Broker,中文翻译过来就是"中间人"的意思,在这里Broker起到一个中间人的角色,在工头提出任务的时候,把全部的任务放到Broker里面,在Broker的另外一头,一群码农等着取出一个个任务准备着手作。redis
这种模式注定了整个系统会是个开环系统,工头对于码农们把任务作的怎样是不知情的,因此咱们要引入Backend来保存每次任务的结果。这个Backend有点像咱们的Broker,也是存储信息用的,只不过这里存的是那些任务的返回结果。咱们能够选择只让错误执行的任务返回结果到Backend,这样咱们取回结果,即可以知道有多少任务执行失败了。mongodb
Celery 介绍数据库
在Celery中几个基本的概念,须要先了解下,否则不知道为何要安装下面的东西。概念:Broker,Backend。ubuntu
Broker:缓存
broker是一个消息传输的中间件,能够理解为一个邮箱。每当应用程序调用celery的异步任务的时候,会向broker传递消息,然后celery的worker将会取到消息,进行程序执行,好吧,这个邮箱能够当作是一个消息队列,其中Broker的中文意思是经纪人,其实就是一开始说的消息队列,用来发送和接受信息。这个broker有几个方案可供选择:RabbitMQ(消息队列),Redis(缓存数据库),数据库(不推荐),等等架构
什么是backend?并发
一般程序发送的消息,发完就完了,可能都不知道对方何时接受了,为此,celery实现了一个backend,用于存储这些消息以及celery执行的一些消息和结果,Backend是在Celery的配置中的一个配置项CELERY_RESULT_BACKEND,做用是保存结果和状态,若是你须要跟踪任务的状态,那么须要设置这一项,能够是Database backend,也能够是Cache backend.app
对于brokers,官方推荐是rabbitmq和redis,至于backend,就是数据库,为了简单能够都使用redis。
Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。
消息中间件
Celery自己不提供消息服务,可是能够方便的和第三方提供的消息中间件集成,包括,RabbitMQ,Redis,MongoDB..............
任务执行单元
Worker是celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。
任务结果存储
Task result store用来存储Worker执行的任务的结果,Celery支持以不一样方式存储任务的结果,包括AMQP,redis,memcached,mongodb,SQLAlchemy,Django
安装Redis,它的安装比较简单:
而后进行配置,通常都在项目的config.py文件里配置:
URL的格式为:
redis://:password@hostname:port/db_number
URL Scheme后的全部字段都是可选的,而且默认为localhost的6479端口,使用数据库0。个人配置是:
redis://:password@ubuntu:6379/5
安装Celery,我是用标准的Python工具pip安装的,以下:
使用Celery
使用celery包含三个方面:1,定义任务函数 2,运行celery服务 3,客户应用程序的调用
建立一个文件tasks.py输入下列代码:
上述代码导入了celery,而后建立了celery实例app,实例化的过程当中指定了任务名tasks(和文件名一致),传入了broker和backend。而后建立了一个任务函数add。下面启动
celery服务,在当前命令行终端运行:
目录结构(celery -A tasks worker --loglevel=info这条命令当前工做目录必须和tasks.py所在的目录相同,即进入tasks.py所在目录执行这条命令)
调用delay函数便可启动add这个任务,这个函数的效果是发送一条消息到broker中去,这个消息包括要执行的函数,函数的参数以及其余消息,具体的能够看Celery官方文档。这个时候worker会等待broker中的消息,一旦收到消息就会马上执行消息。
注意:若是把返回值赋值给一个变量,那么原来的应用程序也会被阻塞,须要等待异步任务返回的结果,所以,实际使用中,不须要把结果赋值。
使用配置文件
Celery的配置比较多,能够在官方配置文档:http://docs.celeryproject.org/en/latest/userguide/configuration.html 查询每一个配置项的含义。
上述的使用是简单的配置,下面介绍一个更健壮的方式来使用celery。首先建立一个python包,celery服务,姑且命名为proj。目录文件以下:
首先是celery.py
这一次建立app,并无直接指定broker和backend。而是在配置文件中。
config.py
剩下的就是tasks.py
使用方法也很简单,在proj的同一级目录执行celery:
celery -A proj worker -l info
如今使用任务也很简单,直接在客户端代码调用proj.tasks里的函数便可。
Scheduler(定时任务,周期性任务)
一种常见的需求是每隔一段时间执行一个任务
在celery中执行定时任务很是简单,只须要设置celery对象的CELERYBEAT_SCHEDULE属性便可。
配置以下
config.py
注意配置文件须要指定时区,这段代码表示每隔30秒执行add函数,一旦使用了scheduler,启动celery须要加上-B参数。
celery -A proj worker -B -l info
参考连接:https://blog.csdn.net/freeking101/article/details/74707619