千家信息网

如何分析Python并行分布式框架中的Celery

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,如何分析Python并行分布式框架中的Celery,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Celery (芹菜)是基于Python
千家信息网最后更新 2026年11月02日如何分析Python并行分布式框架中的Celery

如何分析Python并行分布式框架中的Celery,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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

架构设计

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

  • 消息中间件

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

  • 任务执行单元

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

  • 任务结果存储

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

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

  • 并发

    Prefork, Eventlet, gevent, threads/single threaded

  • 序列化

    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.rpmwget http://rpms.famillecollet.com/enterprise/remi-release-6.rpmsudo 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 Celeryapp = Celery('tasks', backend='amqp', broker='amqp://guest@localhost//')app.conf.CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'@app.taskdef 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 addimport timeresult = 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作为一个消息队列,当消息被取走后,队列中就没有了,于是客户端总是无法得到任务的执行结果。不知道为什么官方文档对这样的错误视而不见。

看完上述内容,你们掌握如何分析Python并行分布式框架中的Celery的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

任务 结果 消息 存储 运行 客户 客户端 分布式 中间件 官方 日志 过程 队列 不同 单元 文档 支持 服务 框架 分析 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 苏州找大状互联网科技有限公司 中国互联网科技股 没上市的科技互联网公司 广州互联网络科技有限公司 北京禾田雨橡互联网科技 友谊互联网络科技 互联网 新科技 互联网科技博客 盛创互联网科技有限公司 成都仁贤领冠互联网科技有限公司 晓花互联网科技有限公司网址 崇明区互联网教育科技售后服务 广州市恰铎互联网科技有限公司 南博望互联网科技有限公司 为客找房互联网科技公司怎么样 互联网科技机房 三亚科技创新互联网基地 河南商务圈互联网科技有限公司 高科技和互联网的现代国家 互联网科技工作委员会 互联网科技公司官网 海南科技产业互联网平台 恒银科技与互联网金融 汽车互联网创新科技园 港股科技和互联网 互联网公司科技股 想开互联网科技公司怎么样 滨湖区互联网智能科技产品有哪些 互联网科技资金流入
0