一、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. java线程安全之并发Queue

    关闭 原 java线程安全之并发Queue(十三) 2017年11月19日 23:40:23 小彬彬~ 阅读数:12092更多 所属专栏: 线程安全    版权声明:本文为博主原创文章,未经博主允许不 ...

  2. JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

    在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量 ...

  3. crontab不能执行sudo:抱歉,您必须拥有一个终端来执行 sudo

    最近做一个可执行shell调度的需求,要求用户输入shell,然后后台定时调度运行.实现大致为:保存用户的输入,设定时间,crontab定时执行用户的输入.但这里涉及到一个安全问题,如何确定用户的输入 ...

  4. Zabbix agent 在windows上安装部署

    Zabbix agent 在windows上安装部署 1.下载与解压 地址: http://www.zabbix.com/downloads/2.4.4/zabbix_agents_2.4.4.win ...

  5. 修改oracle为归档模式

    1.查看是否为归档模式 SQL> archive log list; Database log mode No Archive Mode Automatic archival Disabled ...

  6. tmux入门

    按键 man tmux和C+b?两个操作可以获得一切. C-b ? 显示快捷键帮助 C-b C-o 调换窗口位置,类似与vim 里的C-w C-b 空格键 采用下一个内置布局 C-b ! 把当前窗口变 ...

  7. MYSQL 中query_cache_size小结

    1 原理    MySQL查询缓存保存查询返回的完整结果.当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段. 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓 ...

  8. html中<a>标签的种类

    在html中a 标签是一个链接标签,然而a 标签也有非常多的种类,在此做一个小结. 一.普通链接 <a href="http://www.baidu.com">百度&l ...

  9. Vue 温故而知新 props如何双向属性绑定

    传送门:https://cn.vuejs.org/v2/guide/components-custom-events.html https://segmentfault.com/q/101000001 ...

  10. Unity3D Adam Demo的学习与研究

      1.简述 这篇文章是对Adam各种相关资料了解后进行一些精简的内容.如果你想仔细研究某个技术请跳转至unity相关页面. Adam官方页面: https://unity3d.com/cn/page ...