九周二次课(12月19日)
17.1 celery简介
17.2 celery小例子python
Celery 是什么?git
Celery 是一个由 Python 编写的简单、灵活、可靠的用来处理大量信息的分布式系统,它同时提供操做和维护分布式系统所需的工具。github
Celery 专一于实时任务处理,支持任务调度。redis
说白了,它是一个分布式队列的管理工具,咱们能够用 Celery 提供的接口快速实现并管理一个分布式的任务队列。app
首先,咱们要理解 Celery 自己不是任务队列,它是管理分布式任务队列的工具,或者换一种说法,它封装好了操做常见任务队列的各类操做,咱们用它能够快速进行任务队列的使用与管理,固然你也能够本身看 rabbitmq 等队列的文档而后本身实现相关操做都是没有问题的。异步
Celery 是语言无关的,虽然它是用 Python 实现的,但他提供了其余常见语言的接口支持。只是若是你刚好使用 Python 进行开发那么使用 Celery 就天然而然了。分布式
想让 Celery 运行起来咱们要明白几个概念:函数
brokers 中文意思为中间人,在这里就是指任务队列自己,Celery 扮演生产者和消费者的角色,brokers 就是生产者和消费者存放/拿取产品的地方(队列)工具
常见的 brokers 有 rabbitmq、redis、Zookeeper 等spa
顾名思义就是结果储存的地方,队列中的任务运行完后的结果或者状态须要被任务发送者知道,那么就须要一个地方储存这些结果,就是 Result Stores 了
常见的 backend 有 redis、Memcached 甚至经常使用的数据均可以。
就是 Celery 中的工做者,相似与生产/消费模型中的消费者,其从队列中取出任务并执行
就是咱们想在队列中进行的任务咯,通常由用户、触发器或其余操做将任务入队,而后交由 workers 进行处理。
理解以上概念后咱们就能够快速实现一个队列的操做:
这里咱们用 redis 当作 celery 的 broker 和 backend。
(其余 brokers 与 backend 支持看这里)
安装 Celery 和 redis 以及 python 的 redis 支持:
1
2
3
|
apt-get install redis-server
pip install redis
pip install celery
|
这里须要注意若是你的 celery 是 4.0 及以上版本请确保 python 的 redis 库版本在 2.10.4 及以上,不然会出现 redis 链接 timeout 的错误,具体参考
而后,咱们须要写一个task:
1
2
3
4
5
6
7
8
|
#tasks.py
from celery import Celery
app = Celery('tasks', backend='redis://localhost:6379/0', broker='redis://localhost:6379/0') #配置好celery的backend和broker
@app.task #普通函数装饰为 celery task
def add(x, y):
return x + y
|
OK,到这里,broker 咱们有了,backend 咱们有了,task 咱们也有了,如今就该运行 worker 进行工做了,在 tasks.py 所在目录下运行:
1
|
celery -A tasks worker --loglevel=info
|
意思就是运行 tasks 这个任务集合的 worker 进行工做(固然此时broker中尚未任务,worker此时至关于待命状态)
最后一步,就是触发任务啦,最简单方式就是再写一个脚本而后调用那个被装饰成 task 的函数:
1
2
3
4
5
6
|
#trigger.py
from tasks import add
result = add.delay(4, 4) #不要直接 add(4, 4),这里须要用 celery 提供的接口 delay 进行调用
while not result.ready():
time.sleep(1)
print 'task done: {0}'.format(result.get())
|
运行此脚本
delay 返回的是一个 AsyncResult 对象,里面存的就是一个异步的结果,当任务完成时result.ready()
为 true,而后用 result.get()
取结果便可。
到此,一个简单的 celery 应用就完成啦。