解决同步阻塞的问题

将耗时任务放到后台异步执行,不影响用户其他操作。

实现原理

任务队列是一种跨线程,跨机器的机制。

任务队列中包含称作任务的工作单元。有专门的进程持续不断的监视任务队列,并从中得到新的任务处理。

elery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的信息派发给worker来处理。

  一个celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。

broker

RabbitMQ是一个功能完备,稳定的并且易于安装的broker. 它是生产环境中最优的选择。

Redis也是一款功能完备的broker可选项,但是其更可能因意外中断或者电源故障导致数据丢失的情况。 关于是有那个Redis作为Broker,可访下面网址:http://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html#broker-redis

使用

1.创建应用

首先创建tasks.py模块

from celery import Celery

# 我们这里案例使用redis作为broker
app = Celery('demo', broker='redis://:332572@127.0.0.1/1') # 创建任务函数
@app.task
def my_task():
print("任务函数正在执行....")

Celery第一个参数是给其设定一个名字, 第二参数我们设定一个中间人broker, 在这里我们使用Redis作为中间人。my_task函数是我们编写的一个任务函数, 通过加上装饰器app.task, 将其注册到broker的队列中。

  现在我们在创建一个worker, 等待处理队列中的任务.打开终端,cd到tasks.py同级目录中,执行命令:

celery -A tasks worker --loglevel=info

2.调用任务

任务加入到broker队列中,以便刚才我们创建的celery workder服务器能够从队列中取出任务并执行。如何将任务函数加入到队列中,可使用delay()。

进入python终端, 执行如下代码:

from tasks import my_task
my_task.delay()

3.存储结果

如果我们想跟踪任务的状态,Celery需要将结果保存到某个地方。有几种保存的方案可选:SQLAlchemy、Django ORM、Memcached、 Redis、RPC (RabbitMQ/AMQP)。

  例子我们仍然使用Redis作为存储结果的方案,任务结果存储配置我们通过Celery的backend参数来设定。我们将tasks模块修改如下:

from celery import Celery

# 我们这里案例使用redis作为broker
app = Celery('demo',
backend='redis://:332572@127.0.0.1:6379/2',
broker='redis://:332572@127.0.0.1:6379/1') # 创建任务函数
@app.task
def my_task(a, b):
print("任务函数正在执行....")
return a + b

我们给Celery增加了backend参数,指定redis作为结果存储,并将任务函数修改为两个参数,并且有返回值。

配置

1.直接通过app来配置

from celery import Celery
app = Celery('demo')
# 增加配置
app.conf.update(
result_backend='redis://:332572@127.0.0.1:6379/2',
broker_url='redis://:332572@127.0.0.1:6379/1',
)

2.专有配置文件

对于比较大的项目,我们建议配置信息作为一个单独的模块。我们可以通过调用app的函数来告诉Celery使用我们的配置模块。

配置模块的名字我们取名为celeryconfig, 这个名字不是固定的,我们可以任意取名,建议这么做。我们必须保证配置模块能够被导入。

下面我们在tasks.py模块 同级目录下创建配置模块celeryconfig.py:

result_backend = 'redis://:332572@127.0.0.1:6379/2'
broker_url = 'redis://:332572@127.0.0.1:6379/1'

tasks.py文件修改为:

from celery import Celery
import celeryconfig # 我们这里案例使用redis作为broker
app = Celery('demo') # 从单独的配置模块中加载配置
app.config_from_object('celeryconfig')

django使用celery示例

1.创建celery_tasks包

创建main.py config.py 具体的任务包eg:sms

在sms包中创建tasks.py

tasks.py 代码

from celery_tasks.main import app

@app.task(name='my_task1')
def my_task1(*args, **kwargs):
print('执行任务1发送sms短信')

config.py代码

broker_url = "redis://127.0.0.1/14"

main.py代码

from celery import Celery

# 为celery使用django配置文件进行设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
os.environ['DJANGO_SETTINGS_MODULE'] = 'demo.settings.dev' # 创建celery应用
app = Celery('my_app') # 导入celery配置
app.config_from_object('celery_tasks.config') # 自动注册celery任务
app.autodiscover_tasks(['celery_tasks.sms'])

启动celery

celery -A celry_tasks.main worker -l info

在需要调用任务的模块使用

from celery_tasks.sms import tasks as sms_tasks

 sms_tasks.send_sms_code.delay(mobile, sms_code, sms_code_expires)

celery简单理解和使用的更多相关文章

  1. git的简单理解及基础操作命令

    前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...

  2. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  3. [转]简单理解Socket

    简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html  题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...

  4. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  5. Deep learning:四十六(DropConnect简单理解)

    和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...

  6. Deep learning:四十二(Denoise Autoencoder简单理解)

    前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...

  7. 简单理解dropout

    dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...

  8. 我们为之奋斗过的C#-----C#的一个简单理解

    我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...

  9. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

随机推荐

  1. 设计模式--适配器模式(Adapter)详解

    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式. 01.类的适配器模式 核心 ...

  2. 10个实用的Django技巧和建议

    Django 作为一个杰出的Python开源框架,或许得不到和其它流行框架如Rails这样多的赞美,但是它和其他框架一样精炼,非常注重DRY(Don’t Repeat Yoursef)原则.组件的重用 ...

  3. js实现水平伸缩菜单

    window.onload=function(){ var aA=document.getElementsByTagName('a'); for(var i=0; i<aA.length; i+ ...

  4. gitlab 安装提速

    因为城墙的问题必须该用国内的taobao源 # 更换源地址gem sources --remove https://rubygems.org/ gem sources -a http://ruby.t ...

  5. 编写高质量代码改善C#程序的157个建议——建议62:避免嵌套异常

    建议62:避免嵌套异常 应该允许异常在调用堆栈上往上传,不要过多的使用catch,然后再throw.过多的使用catch会带来两个问题: 1)代码更多了.这看上去好像你根本不知道怎么处理异常,所以你总 ...

  6. 迟到的成果——Qt 小学生出题神器设计

    Github传送门 Part 1.成果展示及感想 原先一直有个疑惑的问题困扰着对Qt一无所知的我:如何才能使得C++代码在Qt上运行.然而这种困惑在进一步对Qt的了解过程中都得到了慢慢的解决,逐渐有一 ...

  7. Java多线程设计模式(三)

    目录(?)[-] Read-Wirte Lock Pattern Thread-Per-Message Pattern Worker Thread Pattern   Read-Wirte Lock ...

  8. 洛谷P2387 [NOI2014]魔法森林(lct维护最小生成树)

    题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n 个节点 m 条边的无向图,节点标号为 1,2,3,…,n,边标号为 1,2,3,…, ...

  9. Sed的使用方法简介

    =============Sed================== Sed:是一款流编辑工具,用来对文本进行过滤与替换工作,特别是当你想对几十个配置文件进行统一修改时,你会体会到它的魅力:Sed通过 ...

  10. 阿里云ECS搭建开源跳板机jumpserver无法获取验证邮件的问题及解决办法

    这段时间自己在阿里云上搭建了jumpserver3.0,在安装过程中需要输入邮箱smtp地址,输入之后会有一封验证邮件的,但是在阿里云ECS服务器上却无法收到邮件.查阅了阿里云官方的说明: 为什么无法 ...