Python环境下安装使用异步任务队列包Celery的基础教程


Posted in Python onMay 07, 2016

1.简介

celery(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。
celery用于生产系统每天处理数以百万计的任务。
celery是用Python编写的,但该协议可以在任何语言实现。它也可以与其他语言通过webhooks实现。
建议的消息代理RabbitMQ的,但提供有限支持Redis, Beanstalk, MongoDB, CouchDB, ,和数据库(使用SQLAlchemy的或Django的 ORM) 。
celery是易于集成Django, Pylons and Flask,使用 django-celery, celery-pylons and Flask-Celery 附加包即可。

2. 安装
有了上面的概念,需要安装这么几个东西:RabbitMQ、SQLAlchemy、Celery
安装方式也都很简单: RabbitMQ:
mac下:

brew install rabbitmq

linux:

sudo apt-get install rabbitmq-server

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

$ rabbitmq-server[回车]

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

3. 简单案例
确保你之前的RabbitMQ已经启动。
还是官网的那个例子,在任意目录新建一个tasks.py的文件,内容如下:

from celery import Celery

app = Celery('tasks', broker='amqp://guest@localhost//')

@app.task
def add(x, y):
  return x + y

在同级目录执行:

$ celery -A tasks worker --loglevel=info

该命令的意思是启动一个worker,把tasks中的任务(add(x,y))把任务放到队列中。
保持窗口打开,新开一个窗口进入交互模式,python或者ipython:

>>> from tasks import add
>>> add.delay(4, 4)

到此为止,你已经可以使用celery执行任务了,上面的python交互模式下简单的调用了add任务,并传递4,4参数。
但此时有一个问题,你突然想知道这个任务的执行结果和状态,到底完了没有。因此就需要设置backend了。
修改之前的tasks.py中的代码为:

# coding:utf-8
import subprocess
from time import sleep

from celery import Celery

backend = 'db+mysql://root:@192.168.0.102/celery'
broker = 'amqp://guest@192.168.0.102:5672'

app = Celery('tasks', backend=backend, broker=broker)


@app.task
def add(x, y):
  sleep(10)
  return x + y


@app.task
def 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的匹配的?目前还不太了解,等深入使用之后再说。

Python 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
python实现指定字符串补全空格的方法
Apr 30 Python
Python生成随机验证码的两种方法
Dec 22 Python
Python线程创建和终止实例代码
Jan 20 Python
对web.py设置favicon.ico的方法详解
Dec 04 Python
对Django外键关系的描述
Jul 26 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
pandas apply多线程实现代码
Aug 17 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
TensorFlow的环境配置与安装方法
Feb 20 Python
Python编写电话薄实现增删改查功能
May 07 #Python
Python的dict字典结构操作方法学习笔记
May 07 #Python
Python 类与元类的深度挖掘 II【经验】
May 06 #Python
Python 类与元类的深度挖掘 I【经验】
May 06 #Python
Python 迭代器工具包【推荐】
May 06 #Python
Python中内建函数的简单用法说明
May 05 #Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 #Python
You might like
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
python实现批量转换图片为黑白
2020/06/16 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
求职简历推荐信范文
2013/12/02 职场文书
出国留学经济担保书
2014/04/01 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
活动总结书怎么写
2015/05/11 职场文书
卡特教练观后感
2015/06/08 职场文书