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

python linux教程_在RedHat系统Linux上部署Python的Celery框架的教程相关推荐

  1. python 重启电脑_如何在系统重启后恢复Python脚本?

    你有一系列问题:保存状态(包括当前执行点) 检测到关机/重启 关机后重新启动.在 我建议您最好忽略中间的问题,并确保应用程序保持最少的内部状态,即将所有数据存储在外部数据库中等 编辑:确保可以将状态保 ...

  2. python安装numpy模块教程_如何在windows机器上安装python 3.6的matplotlib和numpy模块?...

    如果你在python(3.6)命令提示符Windows上执行以下命令时收到无效的Systemax错误:import matplotlib import scipy import numpy 在浏览器下 ...

  3. Linux(ubuntu)重新装完系统WIFI没有驱动、无法连接简易上网教程

    Linux(ubuntu)重新装完系统WIFI没有驱动.无法连接简易上网教程 1.换一个无线网卡管理器: wicd 执行下载程序 中间会有一次提示按回车 sudo apt-get install wi ...

  4. 在Oracle Linux上部署Yunzai Bot v3保姆式教程/甲骨文云/云崽Bot/原神

    去我的博客查看本文:在Oracle Linux上部署Yunzai Bot v3保姆式教程 – 肚 (iocky.com) 本文也在Github与gitee可用. 初始配置 直接注册最低配置的就ok了, ...

  5. 微软官方教程教你如何在Windows上做Python开发?

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 教程地址:https://docs.microsoft.com/zh-cn/win ...

  6. 怎么抓python程序的包_如何在AWS上部署python应用程序

    如何在AWS上部署python应用程序,学姐呕心沥血亲自总结,亲测有效,比网上看网上大把大把的文档要快得多! 作者:蕾学姐 亚马逊云计算服务(Amazon Web Services,缩写为AWS),由 ...

  7. 蒙特卡洛python求解派_用蒙特卡洛方法计算派-python和R语言

    标签: 用蒙特卡洛方法算pi-基于python和R语言 最近follow了MOOC上一门python课,开始学Python.同时,买来了概率论与数理统计,准备自学一下统计.(因为被鄙视过不是统计专业却 ...

  8. fossid安装教程_如何在一个 U 盘上安装多个 Linux 发行版

    本教程介绍如何在一个 U 盘上安装多个 Linux 发行版.这样,你可以在单个 U 盘上享受多个现场版live Linux 发行版了. 我喜欢通过 U 盘尝试不同的 Linux 发行版.它让我可以在真 ...

  9. 微软 python教程_最强福利——来自微软的Python学习教程(开发指南)

    各位小伙伴们,大家有多久没有发现柳猫这么勤奋的更新啦~ 今天给小伙伴们带来微软的官方福利,你没看错,就是来自微软的官方Python学习教程(开发指南)~ 之前微软上线过一套 Python 教程< ...

最新文章

  1. springboot配置Druid数据源
  2. GRE词汇乱序版-夹生的词汇3
  3. python中3个单引号_Python中单引号,双引号,3个单引号及3个双引号的区别
  4. FTP(File Transfer Protocol)搭建文件传输服务器vsftp(vsftpd)(FTP和SFTP区别)(未完成)
  5. 一个html5流星雨源码
  6. Tomcat 申请证书配置https
  7. 网易云深度学习第二课notebook1
  8. SQL约束脚本的用法
  9. Android 音频开发(三) 如何播放一帧音频数据上
  10. Linux内核深入理解系统调用(1):初始化-入口-处理-退出
  11. 笔记 我的Linux入门之路,我的LINUX之路----linux目录文件管理
  12. web前端是不是没有前景了?
  13. 深度学习的最新研究进展(二)
  14. Quick BI 支持多种数据源进行多维分析
  15. Mybatis高级映射一对一查询
  16. AD9361 介绍 (上)
  17. win10无法打开网页
  18. 诺基亚pc远程服务器,用远程桌面把win10装进iphone —-40核256G内存的生产力工具随身带...
  19. LifecycleBeanPostProcessor的作用
  20. python爬取微博恶评_用python写网络爬虫-爬取新浪微博评论

热门文章

  1. HDU1048 盐水的故事 精度问题
  2. java putnextentry_Java对zip格式压缩和解压缩
  3. java filechannel 空_FileChannel的基本操作
  4. 川崎焊接机器人编程实例_机器人现场编程-川崎机器人示教-综合命令.pptx
  5. java的jbutton啥意思,Jbutton和Jpanel和JFrame之间的区别?
  6. ASP——Request.Form()方法获取POST提交方式的表单中文乱码解决方案
  7. Codeforces 1196D RGB Substring
  8. Memory and Crow
  9. android异常信息,Android 获取设备信息 异常
  10. 用百度开放地图api在代码中获得两地距离