前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Celery的安装和使用

Celery的安装和使用

作者头像
the5fire
发布2019-02-28 17:34:54
1.3K0
发布2019-02-28 17:34:54
举报

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:

代码语言:javascript
复制
mac下:
brew install rabbitmq
linux:
sudo apt-get install rabbitmq-server

剩下两个都是Python的东西了,直接pip安装就好了,对于从来没有安装过MySQL驱动的同学可能需要安装MySQL-python。

安装完成之后,启动服务:

代码语言:javascript
复制
$ rabbitmq-server[回车]

启动后不要关闭窗口, 下面操作新建窗口(Tab)

3. 简单案例

确保你之前的RabbitMQ已经启动。

还是官网的那个例子,在任意目录新建一个tasks.py的文件,内容如下:

代码语言:javascript
复制
fromceleryimportCeleryapp=Celery('tasks',broker='amqp://guest@localhost//')@app.taskdefadd(x,y):returnx+y

在同级目录执行:

代码语言:javascript
复制
$ celery -A tasks worker --loglevel=info

该命令的意思是启动一个worker,把tasks中的任务(add(x,y))把任务放到队列中。

保持窗口打开,新开一个窗口进入交互模式,python或者ipython:

代码语言:javascript
复制
>>> from tasks import add
>>> add.delay(4, 4)

到此为止,你已经可以使用celery执行任务了,上面的python交互模式下简单的调用了add任务,并传递4,4参数。

但此时有一个问题,你突然想知道这个任务的执行结果和状态,到底完了没有。因此就需要设置backend了。

修改之前的tasks.py中的代码为:

代码语言:javascript
复制
# coding:utf-8importsubprocessfromtimeimportsleepfromceleryimportCelerybackend='db+mysql://root:@192.168.0.102/celery'broker='amqp://guest@192.168.0.102:5672'app=Celery('tasks',backend=backend,broker=broker)@app.taskdefadd(x,y):sleep(10)returnx+y@app.taskdefhostname():returnsubprocess.check_output(['hostname'])

除了添加backend之外,上面还添加了一个who的方法用来测试多服务器操作。修改完成之后,还是按照之前的方式启动。

同样进入python的交互模型:

代码语言:javascript
复制
>>> 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,并启动:

代码语言:javascript
复制
$ celery -A tasks worker --loglevel=info

发现前一个服务器的Celery服务中输出你刚启动的服务器的hostname,前提是那台服务器连上了你的rabbitmq。

然后再进入python交互模式:

代码语言:javascript
复制
>>> 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的匹配的?目前还不太了解,等深入使用之后再说。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-02-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 基础概念
  • 2. 安装
  • 3. 简单案例
  • 4. 测试多服务器
  • 5. RabbitMQ远程连接的问题
  • 6. 总结的说
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档