共计 3762 个字符,预计需要花费 10 分钟才能阅读完成。
celery 学习笔记整顿 4 大模块 近 30 页 第一期
明天我将带来 celery 相干常识第一期,后续的话文章会缓缓公布
残缺笔记地址:
celery 学习笔记整顿 4 大模块 近 30 页(第一期)– 知乎 (zhihu.com)
1. 问题抛出
咱们在做网站后端程序开发时,会碰到这样的需要:用户须要在咱们的网站填写注册信息,咱们发给用户一封注册激活邮件到用户邮箱,如果因为各种起因,这封邮件发送所需工夫较长,那么客户端将会期待很久,造成不好的用户体验.
那么怎么解决这样的问题呢?
咱们将耗时工作放到后盾异步执行。不会影响用户其余操作。除了注册性能,例如上传,图形处理等等耗时的工作,都能够依照这种思路来解决。如何实现异步执行工作呢?咱们可应用 celery. celery 除了方才所波及到的异步执行工作之外,还能够实现定时解决某些工作。
celery 介绍
Celery 是一个性能齐备即插即用的工作队列。它使得咱们不须要思考简单的问题,应用非常简单。celery 看起来仿佛很宏大,本章节咱们先对其进行简略的理解,而后再去学习其余一些高级个性。celery 实用异步解决问题,当发送邮件、或者文件上传, 图像处理等等一些比拟耗时的操作,咱们可将其异步执行,这样用户不须要期待很久,进步用户体验。celery 的特点是:
- 简略,易于应用和保护,有丰盛的文档。
- 高效,单个 celery 过程每分钟能够解决数百万个工作。
- 灵便,celery 中简直每个局部都能够自定义扩大。
celery 十分易于集成到一些 web 开发框架中.
工作队列是一种跨线程、跨机器工作的一种机制.
工作队列中蕴含称作工作的工作单元。有专门的工作过程继续一直的监督工作队列,并从中取得新的工作并解决.
celery 通过音讯进行通信,通常应用一个叫 Broker(中间人) 来协 client(工作的收回者) 和 worker(工作的解决者). clients 收回音讯到队列中,broker 将队列中的信息派发给 worker 来解决。
一个 celery 零碎能够蕴含很多的 worker 和 broker,可加强横向扩展性和高可用性能。
咱们能够应用 python 的包管理器 pip 来装置:
pip install -U Celery
也可从官网间接下载安装包:https://pypi.python.org/pypi/…
tar xvfz celery-0.0.0.tar.gz
cd celery-0.0.0
python setup.py build
python setup.py install
Celery 须要一种解决音讯的发送和承受的形式,咱们把这种用来存储音讯的的两头安装叫做 message broker, 也可叫做音讯中间人。作为中间人,咱们有几种计划可抉择:
1.RabbitMQ
RabbitMQ 是一个性能齐备,稳固的并且易于装置的 broker. 它是生产环境中最优的抉择。应用 RabbitMQ 的细节参照以下链接:http://docs.celeryproject.org/en/latest/getting- started/brokers/rabbitmq.html#broker-rabbitmq
如果咱们应用的是 Ubuntu 或者 Debian 发行版的 Linux,能够间接通过上面的命令装置 RabbitMQ: sudo apt-get install rabbitmq-server 装置结束之后,RabbitMQ-server 服务器就曾经在后盾运行。如果您用的并不是 Ubuntu 或 Debian, 能够在以下网址:http://www.rabbitmq.com/downl… 去查找本人所须要的版本软件。
2.Redis
Redis 也是一款性能齐备的 broker 可选项,然而其更可能因意外中断或者电源故障导致数据失落的状况。对于是有那个 Redis 作为 Broker,可访上面网址:http://docs.celeryproject.org/en/latest/getting- started/brokers/redis.html#broker-redis
应用 celery 第一件要做的最为重要的事件是须要先创立一个 Celery 实例,咱们个别叫做 celery 利用,或者更简略间接叫做一个 app。app 利用是咱们应用 celery 所有性能的入口,比方创立工作,治理工作等,在应用 celery 的时候,app 必须可能被其余的模块导入。
1. 创立利用
咱们首先创立 tasks.py 模块, 其内容为:
from celery import Celery
# 咱们这里案例应用 redis 作为 broker
app = Celery('demo', broker='redis://:[email protected]/1')
# 创立工作函数
@app.task
def my_task():
print("工作函数正在执行....")
Celery 第一个参数是给其设定一个名字,第二参数咱们设定一个中间人 broker, 在这里咱们应用 Redis 作为中间人。my_task 函数是咱们编写的一个工作函数,通过加上装璜器 app.task, 将其注册到 broker 的队列中。
当初咱们在创立一个 worker,期待解决队列中的工作. 关上终端,cd 到 tasks.py 同级目录中,执行命令:
celery -A tasks worker --loglevel=info
显示成果如下:
2. 调用工作
工作退出到 broker 队列中,以便方才咱们创立的 celery workder 服务器可能从队列中取出工作并执行。如何将工作函数退出到队列中,可应用 delay()。
进入 python 终端, 执行如下代码:
from tasks import my_task
my_task.delay()
执行成果如下:
咱们通过 worker 的控制台,能够看到咱们的工作被 worker 解决。调用一个工作函数,将会返回一个 AsyncResult 对象,这个对象能够用来查看工作的状态或者取得工作的返回值。
3. 存储后果
如果咱们想跟踪工作的状态,Celery 须要将后果保留到某个中央。有几种保留的计划可选:SQLAlchemy、Django ORM、Memcached、Redis、RPC (RabbitMQ/AMQP)。
例子咱们依然应用 Redis 作为存储后果的计划,工作后果存储配置咱们通过 Celery 的 backend 参数来设定。咱们将 tasks 模块批改如下:
from celery import Celery
# 咱们这里案例应用 redis 作为 broker
app = Celery('demo',
backend='redis://:[email protected]:6379/2',
broker='redis://:[email protected]:6379/1')
# 创立工作函数
@app.task
def my_task(a, b):
print("工作函数正在执行....")
return a + b
咱们给 Celery 减少了 backend 参数,指定 redis 作为后果存储, 并将工作函数批改为两个参数,并且有返回值。
更多对于 result 对象信息,请参阅下列网址: http://docs.celeryproject.org/en/latest/reference/celery.result.html#module- celery.result
____
Celery 应用简略,配置也非常简单。Celery 有很多配置选项可能使得 celery 可能合乎咱们的须要,然而默认的几项配置曾经足够应酬大多数利用场景了。
配置信息能够间接在 app 中设置,或者通过专有的配置模块来配置。
1. 间接通过 app 来配置
from celery import Celery
app = Celery('demo')
# 减少配置
app.conf.update(result_backend='redis://:[email protected]:6379/2',
broker_url='redis://:[email protected]:6379/1',
)
2. 专有配置文件
对于比拟大的我的项目,咱们倡议配置信息作为一个独自的模块。咱们能够通过调用 app 的函数来通知 Celery 应用咱们的配置模块。
配置模块的名字咱们取名为 celeryconfig, 这个名字不是固定的,咱们能够任意取名,倡议这么做。咱们必须保障配置模块可能被导入。配置模块的名字咱们取名为 celeryconfig, 这个名字不是固定的,咱们能够任意取名,倡议这么做。咱们必须保障配置模块可能被导入。
上面咱们在 tasks.py 模块 同级目录下创立配置模块 celeryconfig.py:
result_backend = 'redis://:[email protected]:6379/2'
broker_url = 'redis://:[email protected]:6379/1'
tasks.py 文件批改为:
from celery import Celery
import celeryconfig
# 咱们这里案例应用 redis 作为 broker
app = Celery('demo')
# 从独自的配置模块中加载配置
app.config_from_object('celeryconfig')
更多配置: http://docs.celeryproject.org…
____