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 相关文章推荐
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
详解python执行shell脚本创建用户及相关操作
Apr 11 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
Python selenium爬取微博数据代码实例
May 22 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 Python
python 多态 协议 鸭子类型详解
Nov 27 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
php中文本操作的类
2007/03/17 PHP
PHP 工厂模式使用方法
2010/05/18 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
python的Template使用指南
2014/09/11 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
用Python开发app后端有优势吗
2020/06/29 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
如何写早恋检讨书
2014/09/10 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
初中政治教师教学反思
2016/02/23 职场文书
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL