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中的exec、eval使用实例
Sep 23 Python
Python中实现两个字典(dict)合并的方法
Sep 23 Python
python中MySQLdb模块用法实例
Nov 10 Python
python实现超简单端口转发的方法
Mar 13 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
django的ORM操作 增加和查询
Jul 26 Python
python之生产者消费者模型实现详解
Jul 27 Python
pandas 选取行和列数据的方法详解
Aug 08 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
Python __slots__的使用方法
Nov 15 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中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php header函数的常用http头设置
2015/06/25 PHP
php显示页码分页类的封装
2017/06/08 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
js 验证身份证信息有效性
2014/03/28 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
利用python获得时间的实例说明
2013/03/25 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
python主线程捕获子线程的方法
2018/06/17 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
Python如何重新加载模块
2020/07/29 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
表达自我的市场:Society6
2018/08/01 全球购物
优秀中专生推荐信
2013/11/17 职场文书
工程承诺书怎么写
2014/05/24 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
法人代表证明书范本
2015/06/18 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
MySQL创建定时任务
2022/01/22 MySQL
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技