简单了解celery-分布式异步任务调度系统

celery是Python开发的分布式异步任务调度系统,Celery支持的消息服务有rmq、redis等
以下代码使用的是redis作为消息队列,当然官网推荐生产环境使用rmq。

RabbitMQ is feature-complete, stable, durable and easy to install.
It’s an excellent choice for a production environment. Detailed
information about using RabbitMQ with Celery:

celery环境包下载安装,其中指定了阿里镜像,这样下载速度会快

pip install -i http://mirrors.aliyun.com/pypi/simple celery
pip install -i http://mirrors.aliyun.com/pypi/simple celery-with-redis

celery由5个主要组件组成:
producer: 任务发布者, 通过调用API向celery发布任务的程序
celery beat: 任务调度, 根据配置文件发布定时任务
worker: 实际执行任务的程序
broker: 接受任务消息,存入队列再按顺序分发给worker执行
backend: 存储结果的服务器

通过celery worker --app=tasks --loglevel=info 或者celery worker -A tasks -l info

进行本脚本的worker程序启动,代码请查看后面代码区域,简单的一个a+b程序
启动后窗口提示如下

-------------- celery@Lenovo-PC v3.1.24 (Cipater)
---- **** -----
--- * ***  * -- Windows-8-6.2.9200
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         test1:0x33052e8
- ** ---------- .> transport:   redis://127.0.0.1:6379/5
- ** ---------- .> results:     redis://127.0.0.1:6379/6
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ----
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery


[tasks]
  . tasks.add

[2016-10-29 13:14:30,773: INFO/MainProcess] Connected to redis://127.0.0.1:6379/
5
[2016-10-29 13:14:30,786: INFO/MainProcess] mingle: searching for neighbors
[2016-10-29 13:14:31,891: INFO/MainProcess] mingle: all alone
[2016-10-29 13:14:31,930: WARNING/MainProcess] celery@Lenovo-PC ready.

启动后可以在命令行中执行python进行python cmd。
输入如下

>>> from tasks import *
>>> add.delay(1,2)

客户端显示 <AsyncResult: 660b5456-089a-455a-9abd-6c4366b18175> 类似的信息
服务器端可以看到如下的提示

[2016-10-29 13:22:11,693: INFO/MainProcess] Received task: tasks.add[660b5456-08
9a-455a-9abd-6c4366b18175]
[2016-10-29 13:22:11,717: INFO/MainProcess] Task tasks.add[660b5456-089a-455a-9a
bd-6c4366b18175] succeeded in 0.0199999809265s: 3

celery的数据怎么存储的呢?
可以查看文章代码区域的代码。
同时我们也进去redis里面看看。

此时我们把celery worker程序关闭,继续执行以下命令

add.delay(100,100)
add.delay(10,2) 

使用 Redis Desktop Manager(基于QT5开源)工具来查看redis的数据,下载地址为 https://redisdesktop.com,如果官网下载慢,可以在这里下载http://download.csdn.net/detail/bojie5744/9667688
该工具为跨平台的,支持window,mac,ubuntu等。
代码中指定了celery存储的地方在5/6仓库。
可以发现5仓库(图示①处理)的celery数据集合里面有2条记录,那就是刚才把celery worker关闭后执行的2次请求的消息内容(图示③)。
图示②中的数据就是结果的存储,那是我们运行worker后第一次执行的add.delay(1,2)命令生成的。
结果体如下:

{
“status”: “SUCCESS”,
“traceback”: null,
“result”: 3,
“children”: []
}

当我们现在启动worker,即执行celery worker -A tasks -l info
会发现celery数据集合里面的2条未执行任务消息被清空,因为worker启动后就开始了任务的执行。
这里写图片描述

代码区域

#coding=utf-8
from celery import  *
broker = 'redis://127.0.0.1:6379/5'  #消息存储数据存储在仓库5
backend = 'redis://127.0.0.1:6379/6' #消息执行后的结果包括函数返回值的数据存储在仓库6
app = Celery('test1', broker=broker,backend=backend)

app.conf.update(
    CELERY_TASK_SERIALIZER='json', #任务消息信息保存为json格式
    CELERY_ACCEPT_CONTENT=['json'],
    CELERY_RESULT_SERIALIZER='json' # 结果信息保存为json格式
)

@app.task
def add(a, b):
    return a+b 
原创文章 54 获赞 168 访问量 63万+

猜你喜欢

转载自blog.csdn.net/bojie5744/article/details/52965668