django celery的分布式异步之路(一) 起步
如果你看完本文还有兴趣的话,可以看看进阶篇:http://www.cnblogs.com/kangoroo/p/7300433.html
设想你遇到如下场景:
1)高并发
2)请求的执行相当消耗机器资源,流量峰值的时候可能超出单机界限
3)请求返回慢,客户长时间等在页面等待任务返回
4)存在耗时的定时任务
这时你就需要一个分布式异步的框架了。
celery会是一个不错的选择。本文将一步一步的介绍如何使用celery和django进行集成,并进行分布式异步编程。
1、安装依赖
默认你已经有了python和pip。我使用的版本是:
python 2.7.
pip 9.0.1
virtualenv 15.1.0
创建沙盒环境,我们生产过程中通过沙盒环境来使用各种python包的版本,各个应用的沙盒环境之间互不干扰。
$ mkdir kangaroo
$ cd kangaroo
$ virtualenv kangaroo.env
# 沙盒下面有什么,可以看到有python的bin、include和pip
$ ll kangaroo.env
total
drwxrwxr-x data_monitor data_monitor Aug : bin
drwxrwxr-x data_monitor data_monitor Aug : include
drwxrwxr-x data_monitor data_monitor Aug : lib
-rw-rw-r-- data_monitor data_monitor Aug : pip-selfcheck.json
# 让沙盒环境在当前session(shell)中生效
$ source kangaroo.env/bin/activate
# 可以看到命令行首多了(kangaroo.env),而且python的路径已经变了
(kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ which python
/data/home/data_monitor/yangfan/test/kangaroo/kangaroo.env/bin/python
下面我们开始在kangaroo环境下安装相应版本的django和celery,以及django-celery集成包。
(kangaroo.env) [XXX@XXX kangaroo]$ pip install django==1.10.
(kangaroo.env) [XXX@XXX kangaroo]$ pip install celery==3.1.
(kangaroo.env) [XXX@XXX kangaroo]$ pip install django-celery==3.2.
我在安装的时候写明了版本号,是因为这套版本号在我们的生产环境过玩转过。
如果你换了对应的版本号的话,可能会引发冲突,出现意想不到的问题。亲测还是有一些版本之间是有怪问题的。
2、创建工程
创建工程kangaroo:django-admin startproject kangaroo
# 在kangaroo.env同级目录下创建工程kangaroo
cd /home/data_monitor/yangfan/test/kangaroo
# 创建工程kangaroo
(kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ django-admin startproject kangaroo
(kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ ll
total
drwxrwxr-x data_monitor data_monitor Aug : kangaroo
drwxrwxr-x data_monitor data_monitor Aug : kangaroo.env
创建APP foot:python manage.py startapp foot
# 进入工程目录,你会看到manage.py文件
cd kangaroo
# 创建APP foot
(kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ python manage.py startapp foot
(kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ ll
total
drwxrwxr-x data_monitor data_monitor Aug : foot
drwxrwxr-x data_monitor data_monitor Aug : kangaroo
-rwxrwxr-x data_monitor data_monitor Aug : manage.py
# 进入foot app目录,看一下有什么
(kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ cd foot/
(kangaroo.env) [data_monitor@bigdata-arch-client10 foot]$ ll
total
-rw-rw-r-- data_monitor data_monitor Aug : admin.py
-rw-rw-r-- data_monitor data_monitor Aug : apps.py
-rw-rw-r-- data_monitor data_monitor Aug : __init__.py
drwxrwxr-x data_monitor data_monitor Aug : migrations
-rw-rw-r-- data_monitor data_monitor Aug : models.py
-rw-rw-r-- data_monitor data_monitor Aug : tests.py
-rw-rw-r-- data_monitor data_monitor Aug : views.py
至此我们创建了工程kangaroo和app foot,下面我们介绍如何集成celery。
3、django-celery的集成配置
我们这里集成的方式是使用django-celery包。
集成配置要注意以下几个地方就好了,配置起来还是比较简单的。
1)修改kangaroo/settings.py文件
让djcelery模块生效
import os
import djcelery
djcelery.setup_loader()
...
INSTALLED_APPS = (
...
'djcelery',
'kombu.transport.django',
...
)
配置broker和backend
# Celery settings
# redis做broker, 第二个":"前后是redis的用户名密码,后面的2是db
# BROKER_URL = 'redis://:password@10.93.84.53:6379/2'
# rabbitMQ做broker,第二个":"前后是rabbitMQ的用户名密码
BROKER_URL = 'amqp://admin:bigdata123@10.93.21.21:5672//'
# Celery的backend记录地址,这里只给出redis的配置
CELERY_RESULT_BACKEND = 'redis://:bigdata123@10.93.84.53:6379/3'
4、第一个task
其实应该在创建app的时候就将appName添加到settings.py的INSTALLED_APPS中,我们没有这样做事留到现在好说明问题。
我们修改settings.py加入foot。
import os
import djcelery
djcelery.setup_loader()
...
INSTALLED_APPS = (
...
'djcelery',
'kombu.transport.django',
...
'foot',
...
)
当settings.py中的djcelery.setup_loader()运行时, Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件, 找到标记为@task的function, 并将它们注册为celery task。
所以我们在foot包下创建tasks.py文件,并且添加我们的task。
foot/tasks.py
# -*- coding:utf-8 -*-
import time
import logging from celery import task
logger = logging.getLogger(__name__) @task()
def foot_task(param_dict):
logger.info('foot task start! param_dict:%s' % param_dict)
time.sleep(10)
logger.info('foot task finished!')
return
这个task等待接收一个参数字典,只是简单的打印参数,然后sleep10s就退出了。
让task在后台worker中注册,当有任务分发下来的时候就开始执行。只需执行
python manage.py celery worker --loglevel=info
5、分发任务dispatch
任务触发的两种方式:
1)定时调度,可以适用celery beat,这里没有详述,因为在实际生产中,我们使用了apschedule做了定时器。
2)请求异步执行,这里给出了例子,服务接收http请求,直接返回,任务异步的丢给worker执行。
我这里写了一个通用的函数,这个函数用于分发任务
def dispatch(task, param_dict):
param_json = json.dumps(param_dict)
try:
task.apply_async(
[param_json],
retry=True,
retry_policy={
'max_retries': 1,
'interval_start': 0,
'interval_step': 0.2,
'interval_max': 0.2,
},
)
except Exception, ex:
logger.info(traceback.format_exc())
raise
如何触发foot.tasks中的任务呢,只需要
import logging
import traceback
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt from foot.tasks import foot_task
from common.dispatcher import dispatch logger = logging.getLogger(__name__) @csrf_exempt
def hello(request):
if request.method == 'GET':
try:
user = request.GET.get('username')
dispatch(test_task, {'hello': user})
return JsonResponse({'code': 0, 'msg':'success'})
except Exception, ex:
return JsonResponse({'code: -1, 'msg': traceback.format_exc()})
1)当你在客户端发送请求:hello?username='kangaroo'时
2)服务瞬间返回:{'code': 0, 'msg':'success'}
3)后端sleep10秒后执行成功,打印hello:kangaroo
这就是异步的效果。
django celery的分布式异步之路(一) 起步的更多相关文章
- django celery的分布式异步之路(二) 高并发
当你跑通了前面一个demo,博客地址:http://www.cnblogs.com/kangoroo/p/7299920.html,那么你的分布式异步之旅已经起步了. 性能和稳定性是web服务的核心评 ...
- Django+Celery+xadmin实现异步任务和定时任务
Django+Celery+xadmin实现异步任务和定时任务 关注公众号"轻松学编程"了解更多. 一.celery介绍 1.简介 [官网]http://www.celerypro ...
- Django+Celery+Redis实现异步任务(发送邮件)
安装如下依赖库 pip install Celery pip install django-celery pip install django-redis 还要安装本地的Redis服务 setting ...
- django+celery+ RabbitMQ实现异步任务实例
背景 django要是针对上传文件等需要异步操作的场景时,celery是一个非常不错的选择.笔者的项目就是使用了这个组合,这里就做一个备忘吧. 安装RabbitMQ 这个安装及使用我已经在前一 ...
- 如何使用django+celery+RabbitMQ实现异步执行
1)安装需要安装RabbitMQ.Celery和Django-celeryCelery和Django-celery的安装直接pip就好 2)修改settings.py在INSTALLED_APPS中加 ...
- 使用django+celery+RabbitMQ实现异步执行
http://www.yu180.com/group/view/259 推荐一个解决框架 https://github.com/maccman/juggernaut Realtime server p ...
- Django --- celery异步任务与RabbitMQ模块
一 RabbitMQ 和 celery 1 celery Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务, ...
- Python开发【模块】:Celery 分布式异步消息任务队列
Celery 前言: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个 ...
- Django中Celery http请求异步处理(四)
Django中Celery http请求异步处理 本章延续celery之前的系列 1.settings配置 2.编写task jib_update_task任务为更新salt jid数据 3.url设 ...
随机推荐
- 正则语言引擎:一个简单LEX和YACC结合运用的实例
本文先描述了LEX与YACC的书写方法.然后利用LEX与YACC编写了一个简单正则语言的引擎(暂时不支持闭包与或运算),生成的中间语言为C语言. 正则引擎应直接生成NFA或DFA模拟器的输入文件,但在 ...
- c# DateTime 类
获得当前系统时间: DateTime dt = DateTime.Now;Environment.TickCount可以得到"系统启动到现在"的毫秒值DateTime now = ...
- NHibernate教程(20)——二级缓存(上)
本节内容 引入 介绍NHibernate二级缓存 NHibernate二级缓存提供程序 实现NHibernate二级缓存 结语 引入 上一篇我介绍了NHibernate内置的一级缓存即ISession ...
- 【Socket编程】Java中网络相关API的应用
Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...
- 【Alpha】Daily Scrum Meeting——Day7
站立式会议照片 1.本次会议为第7次Meeting会议: 2.本次会议在上午大课间09:40,在禹州楼召开,本次会议为30分钟讨论昨天的任务完成情况以及接下来的任务安排. 燃尽图 每个人的工作分配 成 ...
- Swing-布局管理器之BorderLayout(边界布局)-入门
注:本文内容基本源于Java图形化界面设计——布局管理器之BorderLayout(边界布局),笔者学习过程中根据自身理解进行少量编辑. 边界布局管理器(BorderLayout)把容器的的布局分为五 ...
- 201521123088《JAVA程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4 ...
- 201521123088《Java程序设计》第七周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 ArrayList代码分析1.1 解释ArrayList的contains源代码源代码: //contain ...
- 201521044091 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. ●接口可以定义行为,但却不能定义操作: ●使用abstract方法修饰可能变化的 ...
- 201521123102 《Java程序设计》第1周学习总结
#1. 本周学习总结(1)初步了解java程序的运行环境,通过命令行语句编译简单的java程序(2)使用notepad编写,cmd下进入文件夹编译程序(3)学习使用各种快捷键补全代码(4)能够区别jd ...