django-celery:任务消息队列

描述

为提高网站性能,很多耗时,但不影响页面正常的操作,可丢给消息队列异步执行

“”“
比如SNS网站的“新鲜事儿”系统,我发帖之后,会给所有关注我的人推送一条通知。乍一看没什么难的,发帖之后找出关注我的人, 然后生成相应的消息记录就行了。但问题是,100个人关注我,就要执行100条INSERT查询,更要命的是,Web服务器是同步的, 这100条查询执行完成之前,用户是看不到结果的。
怎么办呢,这时就轮到消息队列上场了。发帖之后只需给队列发送一条消息, 告诉队列“我发帖子了”,然后把发帖的结果返回给用户。 这时另一个叫做worker的进程会取出这条消息并执行那100条INSERT查询。这样,推送通知的操作在后台异步执行, 用户就能立即看到发帖结果。更精彩的是,可以运行多个worker实现分布式,多繁重的任务都不在话下了
“”“

而在icgoo中是为了jiayou接口的调用,在用户完成订单后,将接口调用的函数放入队列,异步去调用接口,不影响用户页面的返回
django-celery正是所要用到的任务消息队列

相关技术

RabbitMQ:消息队列系统,负责存储消息;
celery:worker进程,同时提供在webapp中创建任务的功能。
django-celery: celery在django的使用

参考文档:

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

celery官方文档

安装

安装环境是freebsd,用ports安装

Rabbitmq的安装

[liwei@queen ~]$ whereis rabbitmq
rabbitmq: /usr/ports/net/rabbitmq
[liwei@queen ~]$ cd /usr/ports/net/rabbitmq
[liwei@queen /usr/ports/net/rabbitmq]$ sudo make install

celery的安装

[liwei@queen /usr/ports/devel/py-celery]$ sudo make install

django-celery的安装

下载包:http://pypi.python.org/pypi/django-celery#downloads

然后直接运行: sudo python setup.py install

应用程序示例

建立测试应用程序:

$ 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,内容如下:

切换行号显示

1 from celery.decorators import task
2
3 @task
4 def add(x, y):
5 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实现异步执行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django-Celery是一个用于在Django应用中集成Celery任务队列的插件。它允许你将耗时的任务异步执行,从而提高应用的性能和响应速度。下面是一些使用Django-Celery的步骤: 1. 安装Celery和Django-Celery:首先,确保你已经安装了Celery和Django-Celery。你可以通过运行以下命令来安装它们: ``` pip install celery django-celery ``` 2. 配置Celery:在Django项目的`settings.py`文件中,添加以下配置: ```python # settings.py # 配置Celery Broker(消息代理) BROKER_URL = 'amqp://guest:guest@localhost:5672//' # 配置Celery Backend(结果存储) CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite' # 配置Celery Beat(定时任务CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' ``` 请根据你的实际情况修改上述配置。 3. 创建Celery App:在你的Django项目中,创建一个名为`celery.py`的文件,并添加以下代码: ```python # celery.py from celery import Celery app = Celery('your_project_name') # 配置Celery app.config_from_object('django.conf:settings', namespace='CELERY') # 自动从Django app中加载任务 app.autodiscover_tasks() ``` 确保将`your_project_name`替换为你的项目名称。 4. 创建任务:在Django app中创建一个任务。例如,你可以在你的app目录下创建一个名为`tasks.py`的文件,并添加以下代码: ```python # tasks.py from celery import shared_task @shared_task def add(x, y): return x + y ``` 这是一个简单的任务示例,将两个数字相加并返回结果。 5. 启动Celery Worker:运行以下命令来启动Celery worker: ``` celery -A your_project_name worker --loglevel=info ``` 确保将`your_project_name`替换为你的项目名称。 6. 调用任务:在你的Django应用程序中,你可以通过导入任务函数并调用它来触发任务的执行。例如: ```python from your_app.tasks import add result = add.delay(1, 2) ``` 这里使用了`delay()`方法来异步调用任务。你也可以使用`apply_async()`方法来更精确地控制任务的执行。 这些是使用Django-Celery的基本步骤。你还可以配置更多高级选项,如任务重试、任务结果存储等。请参考Django-Celery的官方文档以获取更多详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值