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

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

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做更进一步的了解,请参考官方文档

(0)

相关推荐

  • Linux 中 RPM包 安装 查询 卸载命令小结及yum命令详解

    之前一直在用ubuntu,安装卸载软件基本上是使用apt-get 这个非常的简单,而且过程中遇到的软件依赖会自动帮我们处理,类似于傻瓜式安装.另外在 Linux 操作系统下,几乎所有的软件都可以通过RPM 进行安装.卸载及管理等操作.RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下软件包的软件.Linux 安装时,除了几个核心模块以外,其余几乎所有的模块均通过RPM 完成安装.RPM 有五种操作模式,分别为:安装.卸载.升级.查

  • centos下yum搭建安装linux+apache+mysql+php环境的方法

    一.脚本YUM源安装: 1.yum install wget #安装下载工具wget 2.wget http://www.atomicorp.com/installers/atomic #下载atomic yum源,配置CentOS 6.5第三方yum源 3. sh ./atomic #脚本执行 4. yum check-update #更新yum软件包 二.163yum源的安装 1.进入yum源配置目录 cd /etc/yum.repos.d 2.备份系统自带的yum源 mv CentOS-B

  • 阿里云云服务器Linux系统更新yum源Shell脚本

    所有执行的脚本都需要root身份来执行,执行方法:以root身份执行命令:bash xxx.sh 功能:自动检测系统并更新源 适用系统版本:兼容线上所有linux版本 执行方法:以root身份执行命令:bash update_source.sh 解决了什么问题:一键式检测系统并更新源 给客户带来了好处:用户只需执行该脚本一次即可自动检测系统并更新源. 备注:由于系统版本都有支持的周期所以部分源可能会出现不可用的情况,包括官方的源,这是正常情况 #!/bin/bash ##############

  • 在Linux中利用yum安装JDK的实现步骤

    一.卸载centos自带的jdk 1.查看当前的jdk版本,并卸载 root@localhost opt]# rpm -qa|grep java java-1.6.0-openjdk-1.6.0.37-1.13.9.4.el5_11 tzdata-java-2015g-1.el5 //卸载 [root@localhost opt]# rpm -e --allmatches --nodeps java-1.6.0-openjdk-1.6.0.37-1.13.9.4.el5_11 [root@loc

  • 关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程

    初入职场,给linux redhat安装环境的时候,遇到这么个问题 [root@localhost ~]# yum -y install gcc Loaded plugins: katello, product-id, security, subscription-manager Updating certificate-based repositories. Unable to read consumer identity Setting up Install Process No packa

  • Redhat Linux下Bind的快速安装

    1.使用光盘自带的软件包,安装以下包: bind bind-utils bind-libs (rpm -i xxx.rpm) 2. 将named服务设置为自启动 (使用ntsysv,chkconfig等工具) 3. 假设你需要解析bcomcn.com,如下操作: cd /var/named cp localdomain.zone bcomcn.zone vi bcomcn.zone $TTL  86400 @       IN      SOA     ns.bcomcn.com. root.b

  • linux下的yum命令原理和详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装.yum提供了查找.安装.删除某一个.一组甚至全部软件包的命令,而且命令简洁而又好记. yum的命令形式一般是如下:yum [options] [command] [package ...] 其中的[opt

  • linux redhat 登陆界面切换

    刚刚安装好redhat 第一次默认登陆的级别是5.而我只安装了editor和development tools 两个包.没有安装图形界面,无法登陆.在图形界面和文字界面之间的切换可以按ctrl+alt+F1来切换登陆界面. 进入系统后可以修改/etc/inittab这个文件.把 id:5:initdefault: 中的5改为3就OK了

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

    Celery (芹菜)是基于Python开发的分布式任务队列.它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度. 架构设计 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成. 1. 消息中间件 Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成.包括,RabbitMQ, Redis, MongoDB (experimental), Amazon

  • 在Docker上部署Python的Flask框架的教程

    本文中,我将尝试展示用Docker开发python应用(主要是Web应用)的可行方法.虽然我本人专注于Python的Flask微框架,但本文目的是演示如何通过Docker更好地开发和共享应用程序,(由任何语言和框架开发的应用程序).Docker通过封装依赖项,大大减少了开发环境和正式产品的差距. 大多数Python开发人员在开发中使用virtualenv.它提供了一种易用的机制让应用程序使用自己专用的依赖项,这些依赖项可能与在其它应用程序或操作系统存在冲突(尤其是不同的Pyhton版本,还有不同

  • 在Heroku云平台上部署Python的Django框架的教程

    Heroku是一个很棒的平台,它有很多的控件,并且搭建环境相对来说也比较容易.本指南中,我将一步一步指导你在Heroku平台上部署一个简单地Django应用 搭建开发环境 Heroku工具链 假设你已经在Heroku平台上注册了一个帐户,并且在里面创建了一款应用,为了一会儿通过CLI与Heroku交互,你需要安装Heroku工具链.在这篇指南中,我们用"Sample-Project"作为应用的名字. Git仓库 在部署你的应用到Heroku之前,你需要先将你的代码签入git仓库中.He

  • 在Linux上安装Python的Flask框架和创建第一个app实例的教程

    无论你在linux上娱乐还是工作,这对你而言都是一个使用python来编程的很好的机会.回到大学我希望他们教我的是Python而不是Java,这学起来很有趣且在实际的应用如yum包管理器中很有用. 本篇教程中我会带你使用python和一个称为flask的微型框架来构建一个简单的应用,来显示诸如每个进程的内存使用,CPU百分比之类有用的信息. 前置需求 Python基础.列表.类.函数.模块.HTML/CSS (基础). 学习这篇教程你不必是一个python高级开发者,但是首先我建议你阅读http

  • 在SAE上部署Python的Django框架的一些问题汇总

    花了些工夫将碎片网部署到了SAE,中途遇到各类问题.感觉SAE看上去很美,实际上却并不是太成熟(至少python版如此). 下面记录下我遇到的一些主要问题以及解决方法. django版本问题 Django1.4都即将发布了,SAE平台自带的SAE版本依旧为1.2x.为使用django1.3版本,你需上传自己的django.具体做法可参考SAE手册中的runtime.html#virtualenv 日志模块出错 最先遇到的是日至模块的问题.错误显示AdminEmailHandler中构造某个类时带

  • 在Linux系统上安装Python的Scrapy框架的教程

    这是一款提取网站数据的开源工具.Scrapy框架用Python开发而成,它使抓取工作又快又简单,且可扩展.我们已经在virtual box中创建一台虚拟机(VM)并且在上面安装了Ubuntu 14.04 LTS. 安装 Scrapy Scrapy依赖于Python.开发库和pip.Python最新的版本已经在Ubuntu上预装了.因此我们在安装Scrapy之前只需安装pip和python开发库就可以了. pip是作为python包索引器easy_install的替代品,用于安装和管理Python

  • Linux上使用Python统计每天的键盘输入次数

    Github 项目主页 工具源码 分析结果: total : 15981 1568.0 == Backspace 1103.0 == Tab 1038.0 == Enter 900.0 == Space 765.0 == L_Alt 730.0 == L_Control 700.0 == S 689.0 == L_Shift 544.0 == I 500.0 == A 494.0 == E 410.0 == N 最后的统计结果,: 删除,Enter 空格 使用最多 Web Redis此项目将re

  • 详解在LINUX上部署带有JAR包的JAVA项目

    在LINUX上部署带有JAR包的JAVA项目 首先eclipse上要装上一个小插件,叫做Fat Jar 点击Fat Jar 红框里选上主类点击Next 如图把勾打上 在该路径下找到jar包 通过ftp协议把jar包放在linux服务器下 进入到jar包路径 输入指令 java -jar XXX.jar 运行成功! 注意!!!!!!!!!!!!!!!! 当你断开服务器连接时,工程会停止! 所以要用下面的指令 指令:nohup java -jar XXX.jar 通过指令ps -ef | grep

  • K8ssandra入门教程之Linux上部署K8ssandra到Kubernetes的过程

    目录 1 什么是K8ssandra 2 安装K8ssandra 2.1 安装Kubenetes 2.2 安装helm3 2.3 用Helm安装K8ssandra 2.4 增加节点 3 查看监控 4 总结 1 什么是K8ssandra Cassandra是一款非常优秀的开源的分布式NoSQL数据库,被许多优秀的大公司采用,具有高可用.弹性扩展.性能好等特点. 正应Cassandra的优势,我们经常需要在云上服务使用,则需要部署Cassandra到K8s上,这就有了K8ssandra.K8ssand

  • Linux上安装Python的PIL和Pillow库处理图片的实例教程

    安装 正常情况,只需 pip install PIL==1.1.7 或者 pip install Pillow==2.9.0 即可.但需留意安装后的输出 安装完成后,需留意输出: *** TKINTER support not available *** JPEG support not available *** WEBP support not available *** ZLIB (PNG/ZIP) support not available *** FREETYPE2 support n

随机推荐