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)
客户端显示
类似的信息
服务器端可以看到如下的提示
[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