基础入门_Python-模块和包.深入Celery之常用架构/方案选型/必知必会?

简单介绍:

说明: 此模块是一个专注于分布式消息传递的异步任务队列,所谓任务就是消息,消息中的有效载荷中包含要执行的任务需要的全部数据

几大特性:



1. Celery易于使用和维护,且不需要配置文件,默认配置启动时自动写入消息代理.

2. Celery高可用,连接丢失或失败时客户端或消费者会自动重试,并且可通过消息代理的双主/主从模式来提高高可用性

3. Celery快速,单个进程每分钟可处理百万任务,且优化后可保持往返延迟在亚毫秒级别

4. Celery灵活,几乎所有部分都支持扩展或单独使用,连接池,序列化,压缩模式,日志,调度器,消费者,生产者,自动扩展,中间人传输等

5. Celery消息代理完美支持RabbitMQ和Redis,其它实验性支持,结果存储完美支持AMQP/Redis/Memcached/MongoDB/SQLAlchemy/DjangoORM/Apache Cassandra,序列化完美支持Pickle/Json/Yaml/Msgpack/Zlib/Bzip2,并发模式完美支持Prefork/Eventlet/Gevent/Worker.

常用架构:

说明: 任务生产者通过Celery API将需要执行的任务丢到一个消息代理的消息队列中,然后由任务消费者根据自身情况从消息队列中获取任务执行,可将它们执行后结果存储,任务发布者/任务消费者是分开运行从而达到异步效果,但是需要注意的是消息代理并不属于Celery组件,官方目前完全支持的有RabbitMQ和Redis,但个人强烈建议RabbitMQ.

补充: 如上Producer既可以为Celery Client也可为Publisher,这是因为Celery作为分布式消息传递的异步任务队列,应用是可以灵活的部署在单台(通过导入执行任务单元)或多台(通过app.send_task(func, (args))实现)主机上.

方案选型:

说明: 综上所属,为了提供更高的性能,强烈推荐选择RabbitMQ做消息代理,C库Librabbitmq做PY客户端接口,Msgpack做客户端与消费者消息序列化,Redis做结果存储.

快速安装:

PY2.6.X: pip install --upgrade "kombu==3.0.37" "celery[librabbitmq,redis,msgpack]==3.1.25" 
PY2.7.X: pip install --upgrade "kombu==3.0.37" "celery[librabbitmq,redis,msgpack]==3.1.25"

注意: 由于Celery3.1.25以上的版本由于官方缺乏资金而移除了相当多的功能,所以还是强烈推荐使用3.1.25这个跨平台长期稳定支持版,目前依然支持PY2.6.X和PY2.7.X

快速上手:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2016-12-24 16:27:01
# @Author  : 李满满 ([email protected])
# @Link    : http://xmdevops.blog.51cto.com/
# @Version : $Id$
from __future__ import absolute_import
# 说明: 导入公共模块
from celery import Celery
# 说明: 导入其它模块
app = Celery(
    __name__,
    broker=‘amqp://root:[email protected]:5672//‘,
    backend=‘redis://10.2.5.51:5123/0‘,
    include=[
    ],
)
@app.task
def add(x, y):
    return x + y


说明: Celery应用必须是可导入的,PY一切皆模块,所以保存如上代码为app.py即可,简单说明,Celery类的第一个参数是当前模块名称,而且是必须的,broker指定消息代理,backend指定结果存储,include指定多个任务执行文件相对导入位置,然后在终端中执行celery worker -A app --loglevel=info启动消费者,然后再启动一个终端在PyShell中执行from app import add;

add.delay(4, 4),此时会调用任务异步返回一个AsyncResult实例,用于检查任务状态result.ready()/等待任务完成result.get(timeout=1, propagate=False)/获取任务返回值,此时可以分别在两边终端以及结果存储中查看变化,其它高端玩法可通过celery --help获取.

必知必会:

说明: 命令行执行celery worker -A <app> --loglevel=info时,<app>必须可导入,所以可以为PY模块或包,但需要注意的不管是包还是模块都必须正确指定Celery入口文件(如果为包则默认的入口文件名为celery.py)的绝对导入名称(app/work.app),Celery通过动态导入获取实例化后的应用,通过实例化时指定的配置以及include来依次导入任务执行文件中的任务指定单元,然后就是等待任务,可以看出Celery是通过相对/绝对导入来查找定义的任务执行单元,PY导入成功后会生成PYC文件,所以代码修改后一定要先删除PYC文件.

时间: 2024-10-10 15:13:16

基础入门_Python-模块和包.深入Celery之常用架构/方案选型/必知必会?的相关文章

基础入门_Python-模块和包.深入Celery之应用配置/独立模块配置实践?

配置简介: 说明: Celery的配置文件非常强大,支持在应用上设置,也可以使用一个独立的配置模块,具体需要调整的默认选项可通过http://docs.jinkan.org/docs/celery/configuration.html#configuration 获取. # 方式一 : 直接在应用上设置,通过app.conf.update可一次性设置多个选项,常用于小型项目 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date    : 20

基础入门_Python-模块和包.深入Celery之Beat触发定时/周期性任务?

任务调度: 1. Celery默认任务单元由任务生产者触发,但有时可能需要其自动触发,而Beat进程正是负责此类任务,能够自动触发定时/周期性任务. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date    : 2016-12-24 17:32:54 # @Author  : 李满满 ([email protected]) # @Link    : http://xmdevops.blog.51cto.com/ # @Version : $

基础入门_Python-模块和包.深入Celery之使用队列以及优先级提高响应?

多个队列: 1. Celery默认使用的队列名为celery默认绑定在direct交换机celery,可通过CELERY_DEFAULT_QUEUE/CELERY_DEFAULT_EXCHANGE/CELERY_DEFAULT_ROUTING_KEY等参数配置修改. #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date    : 2016-12-24 17:32:54 # @Author  : 李满满 ([email protected])

基础入门_Python-模块和包.深入Celery之节点管理/任务调度/任务追踪?

任务管理: 说明: 如上为运行任务后的标准输出,transport为消息代理,concurrency为默认进程池进程数,当所有子进程处于忙碌状态时必须等待空闲子进程处理,如果是IO密集型可尝试使用Eventlet/Gevent协程,具体可参考http://docs.jinkan.org/docs/celery/userguide/concurrency/index.html#concurrency,result为结果存储,queue为所有的队列以及交换机信息列表 参数 含义 %p 节点全名,如[

Android基础入门教程——2.5.4 其他几种常用对话框基本使用

Android基础入门教程--2.5.4 其他几种常用对话框基本使用 标签(空格分隔): Android基础入门教程 本节引言: 上节我们对Dialog的父类:AlertDialog进行了学习,而本节我们来学习下几个常用的 Dialog的基本使用,他们分别是:ProgressDialog(进度条对话框),DatePickerDialog (日期选择对话框)和TimePickerDialog(时间选择对话框)~,话不多说,开始本节内容~ 1.ProgressDialog(进度条对话框)的基本使用

.NET零基础入门09:SQL必知必会

一:前言 仿佛到了更进一步的时候了,每一个程序员迟早都会遇到数据存储的问题.我们拿什么来存储程序产生的数据?举例来说,用什么来存储我们的打老鼠游戏每次的成绩呢?选择如下: 1:内存中.缺点,退出游戏,数据就没了: 2:文件中.好办法!缺点,自己解析文本,把文本变成我们程序中的数据,这个解析的过程叫做协议.协议这个词听上去够恐怖吧,实际上说白了无非就是数据格式怎么样,API接口怎么样之类的东东. 3:数据库.好办法!好吧,数据库文件其实也就是硬盘上的文件,只不过数据库本身就已经为我们定义好了数据格

迈向高阶:优秀Android程序员必知必会的网络基础

1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用的工具类,到后来Google开源的比较完善丰富的Volley,再到如今比较流行的Okhttp.Retrofit. 要想理解他们之间存在的异同(或者具体点说,要想更深入地掌握Android开发中的网络通信技术),必须对网络基础知识.Android网络框架的基本原理等做到心中有数.信手拈来,关键时刻才能

第5节:Java基础 - 必知必会(下)

第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Exception和Error有什么区别 Exception和Error的主要区别可以概括如下: Exception是程序正常运行中预料到可能出现的错误,并且应该被捕获并进行相应处理,是一种异常现象. Error是正常情况下不可能发生的错误,Error会导致JVM处于已追踪不可恢复的状态,不需要捕获处理,比如

SSL证书必知必会:数字证书及CA基础知识

SSL证书必知必会:数字证书及CA基础知识 数字证书 数字证书是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字***,而是身份认证机构盖在数字***上的一个章或印(或者说加在数字***上的一个签名).它是由权威机构--CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份.最简单的证书包含一个公开密钥.名称以及证书授权中心的数字签名.数字证书的一个重要的特征就是只在特