继续尝试没有时间弄明白的技术。
celery官方文档地址:http://docs.celeryproject.org/en/stable/getting-started/introduction.html#get-started。
IBM描述参考地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-celery-web-service/index.html?ca=drs-&utm_source=tuicool&utm_medium=referral#authorN10015
简单的说,可以理解celery是帮助你把一些指定的工作异步化,不用等待io的工具。
比如要发十条短信,需要10秒。如果线性操作,就得等待到短信全部发送完毕之后,再开始执行下面的代码,如果中间某一个死了,你的用户就会呆呆的等待,直到操作超时,这种体验是非常糟糕。如果再amazon买过书都知道,当你在付款完毕之后,马上跳转回来去看你的支付结果,这个时候可能状态还并未做刷新。因为你的付款操作钱虽然打出去了,实际上还在轮流排队支付,这个时候你可以出去刷个微博,然后再回来看你的付款情况,多半都已经会显示支付完毕了这就是异步的好处。
而celery就是为了解决这种问题存在的。
以前一直无法理解这种系统存在的意义和中间人broker扮演的关系。实际上,celery自己就是一个队列系统,但是同时她又无法将存储在队列的消息通知任何人,她需要一个中间人帮忙做这个事情,redis,rabbitmq就做了这个消息传递的中间人。所以处理流程是这样,当我们生产了一个消息,celery将消息放入队列并且中间人redis拿到消息之后将消息拿给空闲的worker进行处理。当我们产生一个异步消息的时候,就是把这个处理放到队列中去排队,最后由worker进行执行。而放这个消息的人并不会等待,会直接返回。而这边消息队列的消息处理完毕之后会以回调的形式回传给发送消息的人。当然这个回调同样有两种方式,用rpc存数据库什么的都是可以的。
这篇文章的重点并不在如何使用上,而是在记录配置上面,关于如何具体使用的流程,IBM那哥们的文章写得非常清楚。
首先在ubuntu上
pip install celery # 安装celery
然后安装redis的python客户端
pip install redis # 安装redis客户端
然后在ubuntu服务器上安装redis数据库
apt-get install redis
然后开始配置celery运行。这里我使用celery的默认配置来跑celery以简化步骤
首先创建一个tasks.py的python脚本,这个脚本里 带着一个会被发送到celery执行的异步任务函数。
from celery import Celery app = Celery('tasks', broker='redis://localhost') @app.task def hello(): return 'hello world'
这里注意,如果你的redis是用密码的 broker的格式就会是这样
app = Celery('tasks', broker='redis://:password@localhost')
不然会连接失败。
然后使用一个worker监视这个任务是否被调用。
celery -A tasks worker
-A是指明app名字的意思。
这个时候成功会出现这样的情况
当你看到celery@xxxx ready的时候 就是你的监控woker启动起来了。这个界面是woker的一个控制台。
之后可以写一个调用生产消息。这里我重新写一个脚本并且调用上面的hello函数。
from tasks import add def notify(a, b): result = add.delay(a, b) return result if __name__ == '__main__': print notify(6, 7)
这里调用的add.delay(a, b)会返回一个task的唯一id,如果我们设了backend 那么我们可以拿着这个返回的唯一id异步取得这个值。
这个将在下篇文章详细介绍。