描述
为提高网站性能,很多耗时,但不影响页面正常的操作,可丢给消息队列异步执行
“”“
比如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实现异步执行
分享到:
相关推荐
celery是一个异步任务队列/基于分布式消息传递的作业队列
Celery文档参考:http://docs.jinkan.org/docs/celery/ ...Django中异步任务—...首先简单介绍一下,Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通
django-rabbitmq-celery-docker-example 使用rabbitmq和celery在django中实现dockerized示例pub / sub类型消息队列的示例。 有关中型故事的详细解释,请参见:发布/订阅角色定义发布者:声明了一个单独的RabbitMQ...
Dockerized异步作业队列Websocket反馈-项目模板/演示-进行中概述: 用户登录django应用,然后生成一次令牌并将其存储到Redis缓存中并发送回给用户用户使用令牌来认证并建立与aiohttp异步Web服务器的websocket连接...
写在前面 ...- celery:一个分布式任务队列框架。 - dj-static:一个用于在Django应用程序中提供静态文件的库。 安装命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django ……
要求取决于以下食谱:属性celery.version - 所需的 celery 版本,默认为 nil(安装最新版本) celerymon.version - 所需的 celery 版本,默认为 nil(安装最新版本)定义本说明书提供以下定义: celery_worker ...
pip3 install django-celery-results INSTALLED_APPS = ( …, ‘django_celery_results’,) # 注意这个是下划线‘_’ python3 manage.py migrate django_celery_results CELERY_RESULT_BACKEND = ‘django-db’ #在...
我的django专栏029阶段Celery消息队列的配置和实现的源码
Django-cron允许您定期运行Django / Python代码,提供跟踪和执行任务的基本管道。 大多数人最常使用的2种方法是编写自定义python脚本或每个cron的管理命令(导致太多的管理命令!)。 除此以外,通常还需要一些跟踪...
首先简单介绍一下,Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。它的
Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行。 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收的工作任务,这个功能依赖于消息...
主要介绍了django中使用Celery 布式任务队列实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
用于扩展容器的docker文件(python和postgresql) 页面,用户和论坛的基本测试用于开发和生产的不同设置文件基本的Bootstrap样式通过Django REST Framework的api 用Redis缓存与Celery的电子邮件任务队列生产和开发...
主要介绍了Django Celery异步任务队列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在 《分布式任务队列Celery使用说明》 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能。本文介绍如何在 Django 中使用 Celery。 安装 pip install django-celery 这个命令使用的依赖是 Celery 3.x...
基于Django+Celery队列实现的集中化异步任务调度系统,可快速应用到任意Django项目中,减轻业务代码的协程、线程池、锁等逻辑的编写复杂度。
本文主要介绍如何在django中用celery完成异步任务,web项目中为了提高用户体验可以对一些耗时操作放到异步队列中去执行,例如激活邮件,后台计算操作等等 当前项目环境为: django==1.11.8 celery==3.1.25 redis==...
本项目是一款集成了Django框架、Ansible工具和Celery异步任务队列的Web平台,简称AnsibleUI。它旨在为用户提供一个便捷、高效的界面,用以批量处理和自动化任务管理。 技术栈: - 主要编程语言:Python - 辅助技术...
django、celery 部署定时任务、异步任务,定时任务重复执行等问题解决方案。