Celery的安装和使用
来源:互联网 发布:淘宝网首页保温杯 编辑:程序博客网 时间:2024/05/21 16:59
http://ju.outofmemory.cn/entry/65138
celery官方文档英文版:http://docs.celeryproject.org/en/latest/index.html
celery官方文档中文版:http://docs.jinkan.org/docs/celery/
Celery是一个分布式任务队列工具,是一个异步的任务队列基于分布式消息传递。更多介绍可以参考 官网
这篇文章只是简单的介绍安装,使用,以及多服务器演示,关于安装和基本使用除了官网详细的英文介绍外,还有很多中文的blog可供参考,但是多服务的演示却没找到相关介绍。
1. 基础概念
在Celery中几个基本的概念,需要先了解下,不然不知道为什么要安装下面的东西。概念:Broker、Backend。
其中Broker的中文意思是 经纪人 ,其实就是一开始说的 消息队列 ,用来发送和接受消息。这个Broker有几个方案可供选择:RabbitMQ,Redis(丢数据),数据库(不推荐),等等
后面的那个Backend是在Celery的配置中的一个配置项 CELERY_RESULT_BACKEND ,作用是保存结果和状态,如果你需要跟踪任务的状态,那么需要设置这一项,可以是Database backend,也可以是Cache backend,具体可以参考这里: CELERY_RESULT_BACKEND 。
我自己演示使用RabbitMQ作为Broker,用mysql作为backend。
2. 安装
有了上面的概念,需要安装这么几个东西:RabbitMQ、SQLAlchemy、Celery
安装方式也都很简单: RabbitMQ:
mac下:brew install rabbitmqlinux:sudo apt-get install rabbitmq-server
剩下两个都是Python的东西了,直接pip安装就好了,对于从来没有安装过MySQL驱动的同学可能需要安装MySQL-python。
安装完成之后,启动服务:
$ rabbitmq-server[回车]
启动后不要关闭窗口, 下面操作新建窗口(Tab)
3. 简单案例
3.1 确保你之前的RabbitMQ已经启动。
还是官网的那个例子,在任意目录新建一个tasks.py的文件,内容如下:
from celery import Celeryapp = Celery('tasks', broker='amqp://guest@localhost//')@app.taskdef add(x, y): return x + y
3.2 使用redis作为消息队列
app = Celery('task', broker='redis://localhost:6379/4')app.conf.update( CELERY_TASK_SERIALIZER='json', CELERY_ACCEPT_CONTENT=['json'], # Ignore other content CELERY_RESULT_SERIALIZER='json', CELERYD_CONCURRENCY = 8)@app.taskdef add(x, y): return x + y
在同级目录执行:
$ celery -A tasks.app worker --loglevel=info
该命令的意思是启动一个worker ( tasks文件中的app实例,默认实例名为app,-A 参数后也可直接加文件名,不需要 .app),把tasks中的任务(add(x,y))把任务放到队列中。
保持窗口打开,新开一个窗口进入交互模式,python或者ipython:
>>> from tasks import add>>> add.delay(4, 4)
到此为止,你已经可以使用celery执行任务了,上面的python交互模式下简单的调用了add任务,并传递4,4参数。
但此时有一个问题,你突然想知道这个任务的执行结果和状态,到底完了没有。因此就需要设置backend了。
修改之前的tasks.py中的代码为:
# coding:utf-8import subprocessfrom time import sleepfrom celery import Celerybackend = 'db+mysql://root:@192.168.0.102/celery'broker = 'amqp://guest@192.168.0.102:5672'app = Celery('tasks', backend=backend, broker=broker)@app.taskdef add(x, y): sleep(10) return x + y@app.taskdef hostname(): return subprocess.check_output(['hostname'])
除了添加backend之外,上面还添加了一个who的方法用来测试多服务器操作。修改完成之后,还是按照之前的方式启动。
同样进入python的交互模型:
>>> from tasks import add, hostname>>> r = add.delay(4, 4)>>> r.ready() # 10s内执行,会输出False,因为add中sleep了10s>>>>>> r = hostname.delay()>>> r.result # 输出你的hostname
4. 测试多服务器
做完上面的测试之后,产生了一个疑惑,Celery叫做分布式任务管理,那它的分布式体现在哪?它的任务都是怎么执行的?在哪个机器上执行的?
在当前服务器上的celery服务不关闭的情况下,按照同样的方式在另外一台服务器上安装Celery,并启动:
$ celery -A tasks worker --loglevel=info
发现前一个服务器的Celery服务中输出你刚启动的服务器的hostname,前提是那台服务器连上了你的rabbitmq。
然后再进入python交互模式:
>>> from tasks import hostname>>>>>> for i in range(10):... r = hostname.delay()... print r.result # 输出你的hostname>>>
看你输入的内容已经观察两台服务器上你启动celery服务的输出。
5. RabbitMQ远程连接的问题
一开始测试时远程服务器无法连接本地的RabbitMQ服务,后来发现需要设置权限,在/usr/local/etc/rabbitmq/rabbitmq-env.conf这个文件中,修改NODE_IP_ADDRESS=127.0.0.1中的ip为0.0.0.0。
6. 总结的说
这篇文章简单的介绍了Celery的使用,重点还是在分布式的使用。觉得不太爽的地方是,在扩展时,需要重新把代码(tasks.py)部署一遍,而不是可以直接把tasks进行共享,可能Celery是通过task来进行不同的worker的匹配的?目前还不太了解,等深入使用之后再说。
- Celery的安装和使用
- Celery、flower和celery-redis 的安装与使用
- celery-redis的安装和使用
- celery+Rabbit MQ的安装和使用
- Flask和Celery的使用
- celery的配置和使用
- Celery(一)---------使用Celery的第一步
- celery、rabbitmq的使用
- Python-Celery的使用
- 安装使用celery异步任务
- Windows安装并使用Celery
- tornado+celery的简单使用
- Celery(二)-----------------使用Celery的第二步
- 01.Celery 简介、安装和HelloWrold
- 使用Celery
- 使用Celery
- django 、celery 中logging的使用
- django使用celery定时任务,使用redis和supervisor。
- 分割字符串(转)
- Cable master
- hdu5327 水题
- 读书笔记MoreEffectiveC++(33)
- 朋友赚 v1.2.0 安卓版
- Celery的安装和使用
- c++ 解决ifstream在断点debug下无法读取文件问题
- hdoj 2141 Can you find it?
- jQuery EasyUI 给datagrid绑定右键菜单
- hdu 5338 ZZX and Permutations 2015多校联合训练赛,贪心,线段树,树状数组
- 地图和定位
- 反编译unity3D游戏资源,源码
- python中linspace()和arange()的区别
- nginx的keep-alive配置