一、Celery是什么?

  Celery是一个简单,灵活且可靠的分布式系统,可以处理大量消息,同时为操作提供维护该系统所需的工具。

  这是一个任务队列,着重于实时处理,同时还支持任务调度。

二、 Celery的架构图:

  • Producer - 任务生产者

顾名思义就是发起调度任务的,然后交给任务队列去处理。简单的Python代码、耦合在Django/Flask Web 服务里请求任务比如调用备份或者调用初始化安装机器的任务,在程序里面调用Celery任务装饰的函数,产生任务并分发到任务队列处理的,我们都可以称之为任务生产者。

  • Celery Beat - 任务调度器 

Celery beat 是 Celery 系统自带的任务生产者,它以独立进程的形式存在,该进程会读取配置文件的内容,周期性地将执行任务的请求发送给任务队列。需要注意的是在一个Celery系统中,只能存在一个 Celery beat 调度器。

  • Broker - 任务代理 

其实broker就是一个队列存储,是负责接收task producer发送的任务消息,存储到队列之后再进行调度,分发给任务消费方 (celery worker)。常见的broker有RabbitMQ、Redis 等。

  • Celery Worker - 任务消费方

Celery worker 就是任务的执行者,它负责接收任务处理中间方发来的任务处理请求,完成这些任务,并且返回任务处理的结果。Celery worker 对应的就是操作系统中的一个进程。Celery 支持分布式部署和横向扩展,我们可以在多个节点增加 Celery worker 的数量来增加系统的高可用性。在分布式系统中,我们也可以在不同节点上分配执行不同任务的 Celery worker 来达到模块化的目的。

  • Result Stores/backend(可选的)

存储Celery worker 执行任务之后的结果和状态信息,以供应用系统查询任务的状态信息。Celery 内置支持AMQP, Redis等方式来保存任务处理后的状态信息。

三、 安装Celery

为了提高性能,我们选择如下方案:

  • RabbitMQ作为消息代理。
  • RabbitMQ的Python客户端选择librabbitmq这个C库。
  • Msgpack做序列化。
  • Redis做结果存储。

安装: 

pip install "celery[librabbitmq,redis,msgpack]"

四、 第一个Celery程序

首先要服务器上已经安装了RabbitMQ、Redis

CentOS上安装配置RabbitMQ Server

Redis的安装配置

4.1. 编写tasks.py
from celery import Celery

app = Celery('tasks', broker='pyamqp://celery:celery@192.168.0.12:5672/celery_vhost',backend='redis://localhost:6379/0')

app.conf.update(
task_serializer='json',
accept_content=['json'], # Ignore other content
result_serializer='json',
timezone='Asia/Shanghai',
enable_utc=True,
) @app.task
def add(x, y):
return x + y

 第一个参数tasks是当前模块的名称。这是必需的,以便在__main__模块中定义任务时可以自动生成名称。

 第二个参数broker是消息代理,格式如下:

  broker_url = 'amqp://myuser:mypassword@localhost:5672/myvhost'

 第三个参数backend是存储任务的执行结果和状态的,格式如下:

  redis://:password@hostname:port/db_number

如果redis和RabbitMQ和程序在同一个机器上,并且都是默认配置,可以直接写为:

app = Celery('tasks', backend='redis://localhost', broker='pyamqp://')

4.2 运行 celery work服务器:
celery -A tasks worker --loglevel=info
celery -A tasks worker --loglevel=info

 -------------- celery@node2 v4.3.0 (rhubarb)
---- **** -----
--- * *** * -- Linux-3.10.-957.1..el7.x86_64-x86_64-with-centos-7.6.-Core -- ::
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: tasks:0x7fb49c8330b8
- ** ---------- .> transport: amqp://celery:**@192.168.0.12:5672/celery_vhost
- ** ---------- .> results: redis://localhost:6379/0
- *** --- * --- .> concurrency: (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery [tasks]
. tasks.add

 要停止worker,只需打Control-C

4.3 后台启动和关闭Celery

默认情况下,它将在当前目录中创建pid和日志文件,以防止多个工作程序相互启动,建议将它们放在专用目录中

$ mkdir -p /var/run/celery
$ mkdir -p /var/log/celery
$ celery multi start w1 -A tasks -l info --pidfile=/var/run/celery/%n.pid \
--logfile=/var/log/celery/%n%I.log

停止worker

celery multi stop w1 -A proj -l info

stop命令是异步的,因此它不会等待工作程序关闭。您可能需要改用该stopwait命令,以确保在退出之前完成所有当前正在执行的任务:
 celery multi stopwait w1 -A proj -l info
4.4 调用任务

在另一个终端打开ipython

In [4]: result = add.delay(4, 4)

In [5]: result.task_id
Out[5]: 'd8d98d41-bb64-4c3a-9c0b-0deab6809597'

  调用任务将返回一个AsyncResult实例。这可用于检查任务的状态,等待任务完成或获取其返回值(或者,如果任务失败,则获取异常和回溯)

在启动celery的终端可以看见已经产生了一个任务,并且返回了执行结果

[2019-10-23 17:02:43,344: INFO/MainProcess] Received task: tasks.add[d8d98d41-bb64-4c3a-9c0b-0deab6809597]
[2019-10-23 17:02:43,364: INFO/ForkPoolWorker-2] Task tasks.add[d8d98d41-bb64-4c3a-9c0b-0deab6809597] succeeded in 0.017695230431854725s: 8

我们也可以在Redis中查看保存的结果信息

127.0.0.1:6379> get celery-task-meta-d8d98d41-bb64-4c3a-9c0b-0deab6809597
"{\"status\": \"SUCCESS\", \"result\": 8, \"traceback\": null, \"children\": [], \"task_id\": \"d8d98d41-bb64-4c3a-9c0b-0deab6809597\", \"date_done\": \"2019-10-23T09:02:43.347416\"}"

  

Celery第一步的更多相关文章

  1. 开发thinkphp的第一步就是给Application目录(不包括其下的文件)777权限, 关闭selinux

    开发thinkphp的时候, 总是会出现各种个样 的奇怪的毛病, 比如: 说什么Application目录不可写, 比如: 说什么 _STORAGE_WRITE_ERROR, 不能生成 Runtime ...

  2. ElasticSearch第一步-环境配置

    ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSearch第四步-查询详解 Elasti ...

  3. Scala的第一步

    第一步:学习使用Scala解释器 开始Scala最简单的方法是使用Scala解释器,它是一个编写Scala表达式和程序的交互式“shell”.在使用Scala之前需要安装Scala,可以参考 Firs ...

  4. UE4蓝图编程的第一步

    认识UE4蓝图中颜色与变量类型: UE4中各个颜色对应着不同的变量,连接点和连线的颜色都在表示此处是什么类型的变量.对于初学者来说一开始看到那么多连接点, 可能会很茫然,搞不清还怎么连,如果知道了颜色 ...

  5. STM32F407第一步之点亮LED

    STM32F407第一步之点亮LED. 要点亮LED,首先了解一下F4的GPIO模块.首先看一下STM32F4数据手册,GPIO模块的内部结构图 看上去有点复杂,不要怕,慢慢理解就可以了.对外引脚那里 ...

  6. 重制AdvanceWars第一步 -- 搞定地图

    首先来聊下高级战争吧Advance Wars,由任天堂旗下的Intelligent Systems开发的战棋游戏.初作诞生于GBA上,后来继续跟进了高战2黑洞崛,而后在下一代掌机DS上也出了三代续作高 ...

  7. 高德携手阿里云发布“LBS云”,账户打通只是第一步

    位置.游戏.视频,是公认的基于云计算的三大移动端应用方向.而今,LBS云有了更多进展,在高价值应用与云平台之间实现了资源打通和融合,高德迈出了实质性的一步. 高德地图副总裁郄建军(左)与阿里云业务总经 ...

  8. 005.TCP--拼接TCP头部IP头部,实现TCP三次握手的第一步(Linux,原始套接字)

    一.目的: 自己拼接IP头,TCP头,计算效验和,将生成的报文用原始套接字发送出去. 若使用tcpdump能监听有对方服务器的包回应,则证明TCP报文是正确的! 二.数据结构: TCP首部结构图: s ...

  9. Theano2.1.2-基础知识之第一步:代数

    来自:http://deeplearning.net/software/theano/tutorial/adding.html Baby Steps - Algebra 一.两个标量相加 在学习the ...

随机推荐

  1. ArcGIS10.6的新功能

    ArcMap 10.6 中引入了新的要素和功能,下面的章节将针对这些内容进行介绍. 要查看有关新特性的最新信息,请参阅 ArcMap web 帮助中的相关主题. 地理处理 3D Analyst 工具箱 ...

  2. maven学习一(HelloWorld工程)

    maven是一个出色的java工程依赖管理的工具,刚刚开始学习用maven建立一个HelloWorld工程. maven安装 $ wget http://mirrors.cnnic.cn/apache ...

  3. Android学习笔记(11):线性布局LinearLayout

    线性布局LinearLayout是指在横向或是竖向一个接一个地排列.当排列的组件超出屏幕后,超出的组件将不会再显示出来. LinearLayout支持的XML属性和相应方法如表所看到的: Attrib ...

  4. Eureka的优势

    http://www.cnblogs.com/zgghb/p/6515062.html Eureka的优势 1.在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选 ...

  5. error C2039: 'SetWindowTextA' : is not a member of 'CString'

    m_OpenPath.SetWindowText(strPath);   错误原因:在给控件关联变量m_OpenPath时,变量类型选择错误   解决办法:

  6. ORA-16447 Redo apply was not active at the target standby database

    Cause ALTER SYSTEM FLUSH REDO TO STANDBY failed because redo apply is not active at the target datab ...

  7. plsql 操纵表数据的2种方式

      1.情景展示 在plsql中,对表的操作(增.删.改.查),其实有2种方式,只是很多人都只会第一种方式罢了. 2.方式介绍 第1种方式:直接将值与sql写到一起 直接按F8运行即可. 第2种方式: ...

  8. 【转】一次SpringMVC+ Mybatis 配置多数据源经历

    需求 现在在维护的是学校的一款信息服务APP的后台,最近要开发一些新功能,其中一个就是加入学校电影院的在线购票.在线购票实际上已经有一套系统了,但是是外包给别人开发的,我们拿不到代码只能拿到数据库,并 ...

  9. top命令详析及排查问题使用演示

    1. top基本使用 top命令运行图 第一行:基本信息 第二行:任务信息 第三行:CPU使用情况 第四行:物理内存使用情况 buff/cache: buffers 和 cache 都是内存中存放的数 ...

  10. JSP 性能优化

    无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载和执行 ...