版权声明
:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2011/06/27/django-celery-rabbitmq-intro/
以及本声明。
RabbitMQ大家应该不陌生,著名的消息队列嘛。可惜我最近才听说它的大名,了解之后不禁惊呼,世界上居然还有这种东西!
立刻觉得手里有了锤子,就看什么都是钉子了,主网站不愿意干的操作统统扔给RabbitMQ去做吧
言归正传,先介绍一下这篇文章的应用场景吧。我们知道大型网站的性能非常重要,然而有时不得不做一些相当耗时的操作。
比如SNS网站的“新鲜事儿”系统,我发帖之后,会给所有关注我的人推送一条通知。乍一看没什么难的,发帖之后找出关注我的人,
然后生成相应的消息记录就行了。但问题是,100个人关注我,就要执行100条INSERT查询,更要命的是,Web服务器是同步的,
这100条查询执行完成之前,用户是看不到结果的。
怎么办呢,这时就轮到消息队列上场了。发帖之后只需给队列发送一条消息, 告诉队列“我发帖子了”,然后把发帖的结果返回给用户。
这时另一个叫做worker的进程会取出这条消息并执行那100条INSERT查询。这样,推送通知的操作在后台异步执行,
用户就能立即看到发帖结果。更精彩的是,可以运行多个worker实现分布式,多繁重的任务都不在话下了。
好了,来看看今天的主角:
- django:web框架,其实只能算作配角了;
- RabbitMQ:消息队列系统,负责存储消息;
- celery:worker进程,同时提供在webapp中创建任务的功能。
安装
安装环境是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配置文档 #### 一、环境搭建与配置 ##### 1.1 系统环境 - **操作系统**: Ubuntu 14.04 ...通过以上步骤,可以实现基于Django框架的异步任务处理功能,提高系统的响应速度和处理能力。
#### 三、使用Celery实现异步任务的基本步骤 1. **创建Celery实例**:初始化Celery实例,配置必要的参数,如Broker地址、Backend地址等。 2. **启动Celery Worker**:运行Celery Worker进程,使其能够监听任务队列...
本项目“基于Django+Celery队列实现的集中化异步任务调度系统”旨在提供一个易于集成的框架,帮助开发者快速在Django项目中实现异步任务处理,降低业务代码的复杂性。 Django是Python领域广泛使用的Web框架,以其...
这个教程旨在教你如何使用Django作为Web框架,Celery作为异步任务队列,Redis作为消息中间件,以及Supervisor作为进程监控工具来构建高效、可扩展的应用。 1. Django: Django是Python的一款高级Web框架,它遵循...
在Django框架中,通过集成Celery和Redis,我们可以实现异步任务处理,从而提高应用的响应速度和用户体验。以下将详细介绍如何在Django中配置和使用Celery与Redis来执行异步任务。 首先,Celery是一个分布式任务队列...
Django通过集成Celery后端支持异步任务,允许开发人员创建可由Celery工作进程在后台运行的任务。 知识点二:Celery基础与集成 Celery是一个独立的消息代理,使用分布式消息传递的方式来进行任务分发。它不需要...
这些任务可以在视图、模型或其他地方调用,然后由Celery异步执行。 8. 并发与调度:Celery支持多种并发策略,如简单工作进程、预取任务等,可以根据系统资源和需求进行选择。同时,可以设置定时任务或者根据任务...
《Python库深度解析:django_celery_results-2.2.0》 在Python的世界里,框架和库的丰富性是其强大之处。...对于任何使用Django并打算利用Celery实现异步任务的开发者来说,理解和掌握这个库是非常有必要的。
【描述】"希望能帮到需要的人" 表明这个项目是作者为了分享和帮助那些在 Django 项目中需要实现异步功能的开发者。它可能包含了一个完整的示例,演示了如何配置 Django 与 Celery 的集成,以及如何定义、调度和执行 ...
**Django-Celery-Rabbitmq-full-example** 是一个基于Python的项目,它演示了如何在Django web框架中使用Celery和RabbitMQ来实现异步任务处理。这个项目对于那些想要提升web应用性能,尤其是需要后台处理耗时任务的...
1. **任务定义**:开发者定义一个任务函数,这个函数包含了需要异步执行的代码。任务通常包含可选的参数,可以根据需要传递不同的输入。 2. **消息中间件**:Celery使用消息中间件(如RabbitMQ或Redis)作为任务...
**标题与描述解析** 标题和描述提到了"django-celery-email",这是一个专门为Django框架设计的电子邮件后端,它利用Celery这个分布式...你可以通过解压并安装这个仓库来使用或研究`django-celery-email`的实现细节。
在实际项目中,`django_celery_ses`的运用不仅限于发送邮件,还可以扩展到其他需要异步处理的任务,比如发送短信通知、执行耗时的计算任务等。通过这种方式,可以有效地提升Django应用的并发处理能力,优化用户体验...
django-rabbitmq-celery-docker-example 使用rabbitmq和celery在django中实现dockerized示例pub / sub类型消息队列的示例。 有关中型故事的详细解释,请参见:发布/订阅角色定义发布者:声明了一个单独的RabbitMQ...
Celery的核心概念是任务,这些任务可以在后台异步执行,而不会影响Web应用的响应时间。它允许开发者将复杂的任务分解为可并行执行的小单元,从而提高应用程序的性能和可扩展性。 `django_celery_async_view`则是将...
标题和描述中提到的知识点主要涉及Django、Celery以及Redis在部署定时任务方面的应用,重点是如何使用这些工具实现多worker和多队列机制。以下是详细的知识点说明。 首先,Celery是一个基于消息队列的异步任务队列/...
这就是Celery发挥作用的地方——它可以帮助Django应用执行异步任务,从而提高性能和用户体验。 **django-celery-results** `django-celery-results`是Celery的一个插件,它提供了一个Django模型作为结果存储后端。...
通过Celery,这些任务可以在后台异步执行,用户无需等待,从而改善了交互体验。 1. **Celery核心概念** - **Task(任务)**:任务是 Celery 中的基本工作单元,可以理解为需要异步执行的函数。 - **Broker(中间...