在RedHat系Linux上部署Python的Celery框架的教程


Posted in Python onApril 07, 2015

 Celery (芹菜)是基于Python开发的分布式任务队列。它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。
架构设计

在RedHat系Linux上部署Python的Celery框架的教程

 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

1. 消息中间件

    Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis, MongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ

2.任务执行单元

    Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

3.任务结果存储

    Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache

另外, Celery还支持不同的并发和序列化的手段

1.并发

    Prefork, Eventlet, gevent, threads/single threaded

2.序列化

    pickle, json, yaml, msgpack. zlib, bzip2 compression, Cryptographic message signing 等等

安装和运行

Celery的安装过程略为复杂,下面的安装过程是基于我的AWS EC2的Linux版本的安装过程,不同的系统安装过程可能会有差异。大家可以参考官方文档。

首先我选择RabbitMQ作为消息中间件,所以要先安装RabbitMQ。作为安装准备,先更新YUM。
 

sudo yum -y update

RabbitMQ是基于erlang的,所以先安装erlang
 
# Add and enable relevant application repositories:
# Note: We are also enabling third party remi package repositories.
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
 
# Finally, download and install Erlang:
yum install -y erlang

然后安装RabbitMQ
 

# Download the latest RabbitMQ package using wget:
wget 
# Add the necessary keys for verification:
rpm --import 
# Install the .RPM package using YUM:
yum install rabbitmq-server-3.2.2-1.noarch.rpm

启动RabbitMQ服务
 

rabbitmq-server start
RabbitMQ服务已经准备好了,然后安装Celery, 假定你使用pip来管理你的python安装包
pip install Celery

 

为了测试Celery是否工作,我们运行一个最简单的任务,编写tasks.py
 
from celery import Celery
 
app = Celery('tasks', backend='amqp', broker='amqp://guest@localhost//')
app.conf.CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'
 
@app.task
def add(x, y):
 return x + y

在当前目录运行一个worker,用来执行这个加法的task
 

celery -A tasks worker --loglevel=info

其中-A参数表示的是Celery App的名字。注意这里我使用的是SQLAlchemy作为结果存储。对应的python包要事先安装好。

worker日志中我们会看到这样的信息
 

- ** ---------- [config]
- ** ---------- .> app:   tasks:0x1e68d50
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results:  db+sqlite:///results.sqlite
- *** --- * --- .> concurrency: 8 (prefork)

其中,我们可以看到worker缺省使用prefork来执行并发,并设置并发数为8

下面的任务执行的客户端代码:
 

from tasks import add
import time
result = add.delay(4,4)
 
while not result.ready():
 print "not ready yet"
 time.sleep(5)
 
print result.get()

用python执行这段客户端代码,在客户端,结果如下
 

not ready 
8

Work日志显示
 

[2015-03-12 02:54:07,973: INFO/MainProcess] Received task: tasks.add[34c4210f-1bc5-420f-a421-1500361b914f]
[2015-03-12 02:54:08,006: INFO/MainProcess] Task tasks.add[34c4210f-1bc5-420f-a421-1500361b914f] succeeded in 0.0309705100954s: 8

这里我们可以发现,每一个task有一个唯一的ID,task异步执行在worker上。

这里要注意的是,如果你运行官方文档中的例子,你是无法在客户端得到结果的,这也是我为什么要使用SQLAlchemy来存储任务执行结果的原因。官方的例子使用AMPQ,有可能Worker在打印日志的时候取出了task的运行结果显示在worker日志中,然而AMPQ作为一个消息队列,当消息被取走后,队列中就没有了,于是客户端总是无法得到任务的执行结果。不知道为什么官方文档对这样的错误视而不见。

如果大家想要对Celery做更进一步的了解,请参考官方文档

Python 相关文章推荐
Python中针对函数处理的特殊方法
Mar 06 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
python redis连接 有序集合去重的代码
Aug 04 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
Python socket处理client连接过程解析
Mar 18 Python
python 三种方法实现对Excel表格的读写
Nov 19 Python
解决Pytorch中关于model.eval的问题
May 22 Python
详解Python requests模块
Jun 21 Python
详解Python3.1版本带来的核心变化
Apr 07 #Python
初学Python函数的笔记整理
Apr 07 #Python
利用Python绘制数据的瀑布图的教程
Apr 07 #Python
浅析Python中的多进程与多线程的使用
Apr 07 #Python
Python多线程编程(八):使用Event实现线程间通信
Apr 05 #Python
Python多线程编程(七):使用Condition实现复杂同步
Apr 05 #Python
Python多线程编程(六):可重入锁RLock
Apr 05 #Python
You might like
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
js 作用域和变量详解
2017/02/16 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
Python对数据进行插值和下采样的方法
2018/07/03 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
缓刑人员的思想汇报
2014/01/11 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
教师职位说明书
2014/07/29 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
详解java如何集成swagger组件
2021/06/21 Java/Android
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers