`
yushine
  • 浏览: 200576 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用django+celery+RabbitMQ实现异步执行

 
阅读更多

RabbitMQ大家应该不陌生,著名的消息队列嘛。可惜我最近才听说它的大名,了解之后不禁惊呼,世界上居然还有这种东西! 立刻觉得手里有了锤子,就看什么都是钉子了,主网站不愿意干的操作统统扔给RabbitMQ去做吧 :D

言归正传,先介绍一下这篇文章的应用场景吧。我们知道大型网站的性能非常重要,然而有时不得不做一些相当耗时的操作。 比如SNS网站的“新鲜事儿”系统,我发帖之后,会给所有关注我的人推送一条通知。乍一看没什么难的,发帖之后找出关注我的人, 然后生成相应的消息记录就行了。但问题是,100个人关注我,就要执行100条INSERT查询,更要命的是,Web服务器是同步的, 这100条查询执行完成之前,用户是看不到结果的。

怎么办呢,这时就轮到消息队列上场了。发帖之后只需给队列发送一条消息, 告诉队列“我发帖子了”,然后把发帖的结果返回给用户。 这时另一个叫做worker的进程会取出这条消息并执行那100条INSERT查询。这样,推送通知的操作在后台异步执行, 用户就能立即看到发帖结果。更精彩的是,可以运行多个worker实现分布式,多繁重的任务都不在话下了。

好了,来看看今天的主角:

  • django:web框架,其实只能算作配角了;
  • RabbitMQ:消息队列系统,负责存储消息;
  • celery:worker进程,同时提供在webapp中创建任务的功能。
django-celery-rabbitmq-intro-1.png

 

安装

安装环境是MacOS,使用其他操作系统的同学请自行调整安装命令。

django的安装配置就不说了,配角嘛。

先来安装RabbitMQ:

$ sudo port install -n rabbitmq

启动RabbitMQ:

$ sudo rabbitmq-server -detached

然后安装celery。到 http://pypi.python.org/pypi/celery#downloads 下载celery并安装:

$ tar xzvf celery-2.2.7.tar.gz
$ cd celery-2.2.7
$ python setup.py build
$ sudo python setup.py install

这个过程会安装数个依赖包,包括 pyparsing、kombu、amqplib、anyjson等,如果自动安装有困难,可以自行下载编译。

由于要在django中使用,我们还得安装django-celery这个模块。 到 http://pypi.python.org/pypi/django-celery#downloads 下载 django-celery 并安装:

$ tar xzvf django-celery-2.2.4.tar.gz
$ cd django-celery-2.2.4
$ python setup.py build
$ sudo python setup.py install

这个过程会安装依赖包 django-picklefield,如有需要请自行下载编译。

应用程序示例

建立测试应用程序:

$ django-admin.py startproject celerytest
$ cd celerytest
$ django-admin.py startapp hello
$ cd hello

然后修改settings.py,在INSTALLED_APPS中加入以下内容:

INSTALLED_APPS = (
  ...
  'djcelery',          # 加入celery
  'hello',             # 测试应用程序
}

在settings.py末尾添加RabbitMQ的配置:

import djcelery
djcelery.setup_loader()
 
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"

当然,别忘了配置数据库选项,因为djcelery要用到数据库的。配置好之后执行:

$ python manage.py syncdb

可以执行 python manage.py 看一下,会发现 djcelery 应用程序给 manage.py 添加了许多celery*开头的命令, 这些就是控制worker的命令了。

接下来我们写个task。新建 hello/tasks.py,内容如下:

from celery.decorators import task

@task
def add(x, y):
  return x + y

修饰符 @task 将add函数变成了异步任务。在webapp中调用add并不会立即执行该函数,而是将函数名、 参数等打包成消息发送到消息队列中,再由worker执行实际的代码(return x + y)。

当然,别忘了必不可少的worker:

$ python manage.py celeryd -l info

在另一个控制台测试一下:

$ python manage.py shell
>>> from hello.tasks import add
>>> r = add.delay(3,5)     # 执行这一行就能在worker的日志中看到运行状况
>>> r.wait()
8

可以看到,add函数是在worker上运行的,实现了异步的效果。当然,队列的特性决定了任务并不是实时执行的,可能有延迟, 有时甚至还会丢失,因此,队列不适合执行关键任务。而那些执行结果无关痛痒、对实时性要求不高的任务, 就可以大胆地交给RabbitMQ去处理,将WebApp解放出来吧。

分享到:
评论

相关推荐

    Django+celery+rabbitmq配置文档

    ### Django+Celery+RabbitMQ配置文档 #### 一、环境搭建与配置 ##### 1.1 系统环境 - **操作系统**: Ubuntu 14.04 ...通过以上步骤,可以实现基于Django框架的异步任务处理功能,提高系统的响应速度和处理能力。

    详解django+django-celery+celery的整合实战

    #### 三、使用Celery实现异步任务的基本步骤 1. **创建Celery实例**:初始化Celery实例,配置必要的参数,如Broker地址、Backend地址等。 2. **启动Celery Worker**:运行Celery Worker进程,使其能够监听任务队列...

    基于Django+Celery队列实现的集中化异步任务调度系统,

    本项目“基于Django+Celery队列实现的集中化异步任务调度系统”旨在提供一个易于集成的框架,帮助开发者快速在Django项目中实现异步任务处理,降低业务代码的复杂性。 Django是Python领域广泛使用的Web框架,以其...

    django+celery+redis+supervisor教程代码

    这个教程旨在教你如何使用Django作为Web框架,Celery作为异步任务队列,Redis作为消息中间件,以及Supervisor作为进程监控工具来构建高效、可扩展的应用。 1. Django: Django是Python的一款高级Web框架,它遵循...

    Django使用Celery加redis执行异步任务的实例内容

    在Django框架中,通过集成Celery和Redis,我们可以实现异步任务处理,从而提高应用的响应速度和用户体验。以下将详细介绍如何在Django中配置和使用Celery与Redis来执行异步任务。 首先,Celery是一个分布式任务队列...

    Django集成celery发送异步邮件实例

    Django通过集成Celery后端支持异步任务,允许开发人员创建可由Celery工作进程在后台运行的任务。 知识点二:Celery基础与集成 Celery是一个独立的消息代理,使用分布式消息传递的方式来进行任务分发。它不需要...

    django工程

    这些任务可以在视图、模型或其他地方调用,然后由Celery异步执行。 8. 并发与调度:Celery支持多种并发策略,如简单工作进程、预取任务等,可以根据系统资源和需求进行选择。同时,可以设置定时任务或者根据任务...

    Python库 | django_celery_results-2.2.0.tar.gz

    《Python库深度解析:django_celery_results-2.2.0》 在Python的世界里,框架和库的丰富性是其强大之处。...对于任何使用Django并打算利用Celery实现异步任务的开发者来说,理解和掌握这个库是非常有必要的。

    django_celery_demo

    【描述】"希望能帮到需要的人" 表明这个项目是作者为了分享和帮助那些在 Django 项目中需要实现异步功能的开发者。它可能包含了一个完整的示例,演示了如何配置 Django 与 Celery 的集成,以及如何定义、调度和执行 ...

    Django-Celery-Rabbitmq-full-example:使用django,celery和rabbitmq分发任务的完整(非常基本)示例

    **Django-Celery-Rabbitmq-full-example** 是一个基于Python的项目,它演示了如何在Django web框架中使用Celery和RabbitMQ来实现异步任务处理。这个项目对于那些想要提升web应用性能,尤其是需要后台处理耗时任务的...

    django-celery

    1. **任务定义**:开发者定义一个任务函数,这个函数包含了需要异步执行的代码。任务通常包含可选的参数,可以根据需要传递不同的输入。 2. **消息中间件**:Celery使用消息中间件(如RabbitMQ或Redis)作为任务...

    django-celery-email:使用celery任务发送电子邮件的Django电子邮件后端

    **标题与描述解析** 标题和描述提到了"django-celery-email",这是一个专门为Django框架设计的电子邮件后端,它利用Celery这个分布式...你可以通过解压并安装这个仓库来使用或研究`django-celery-email`的实现细节。

    Python库 | django_celery_ses-1.0.3-py3-none-any.whl

    在实际项目中,`django_celery_ses`的运用不仅限于发送邮件,还可以扩展到其他需要异步处理的任务,比如发送短信通知、执行耗时的计算任务等。通过这种方式,可以有效地提升Django应用的并发处理能力,优化用户体验...

    django-rabbitmq-celery-docker-example:django在docker上使用Rabbitmq和celery的示例pubsub消息队列实现

    django-rabbitmq-celery-docker-example 使用rabbitmq和celery在django中实现dockerized示例pub / sub类型消息队列的示例。 有关中型故事的详细解释,请参见:发布/订阅角色定义发布者:声明了一个单独的RabbitMQ...

    PyPI 官网下载 | django_celery_async_view-0.1.0.tar.gz

    Celery的核心概念是任务,这些任务可以在后台异步执行,而不会影响Web应用的响应时间。它允许开发者将复杂的任务分解为可并行执行的小单元,从而提高应用程序的性能和可扩展性。 `django_celery_async_view`则是将...

    django、celery、redis部署定时任务(实现多work、多队列).pdf

    标题和描述中提到的知识点主要涉及Django、Celery以及Redis在部署定时任务方面的应用,重点是如何使用这些工具实现多worker和多队列机制。以下是详细的知识点说明。 首先,Celery是一个基于消息队列的异步任务队列/...

    django-celery-results:芹菜结果后端与django

    这就是Celery发挥作用的地方——它可以帮助Django应用执行异步任务,从而提高性能和用户体验。 **django-celery-results** `django-celery-results`是Celery的一个插件,它提供了一个Django模型作为结果存储后端。...

    Django之Celery.docx

    通过Celery,这些任务可以在后台异步执行,用户无需等待,从而改善了交互体验。 1. **Celery核心概念** - **Task(任务)**:任务是 Celery 中的基本工作单元,可以理解为需要异步执行的函数。 - **Broker(中间...

Global site tag (gtag.js) - Google Analytics