如果你看完本文还有兴趣的话,可以看看进阶篇http://www.cnblogs.com/kangoroo/p/7300433.html

设想你遇到如下场景:

1)高并发

2)请求的执行相当消耗机器资源,流量峰值的时候可能超出单机界限

3)请求返回慢,客户长时间等在页面等待任务返回

4)存在耗时的定时任务

这时你就需要一个分布式异步的框架了。

celery会是一个不错的选择。本文将一步一步的介绍如何使用celery和django进行集成,并进行分布式异步编程。

1、安装依赖

默认你已经有了python和pip。我使用的版本是:

  1. python 2.7.
  2. pip 9.0.1
    virtualenv 15.1.0

创建沙盒环境,我们生产过程中通过沙盒环境来使用各种python包的版本,各个应用的沙盒环境之间互不干扰。

  1. $ mkdir kangaroo
  2. $ cd kangaroo
  3. $ virtualenv kangaroo.env
  4. # 沙盒下面有什么,可以看到有python的bin、include和pip
  5. $ ll kangaroo.env
  6. total
  7. drwxrwxr-x data_monitor data_monitor Aug : bin
  8. drwxrwxr-x data_monitor data_monitor Aug : include
  9. drwxrwxr-x data_monitor data_monitor Aug : lib
  10. -rw-rw-r-- data_monitor data_monitor Aug : pip-selfcheck.json
  11. # 让沙盒环境在当前session(shell)中生效
  12. $ source kangaroo.env/bin/activate
  13. # 可以看到命令行首多了(kangaroo.env),而且python的路径已经变了
  14. (kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ which python
  15. /data/home/data_monitor/yangfan/test/kangaroo/kangaroo.env/bin/python

下面我们开始在kangaroo环境下安装相应版本的django和celery,以及django-celery集成包。

  1. (kangaroo.env) [XXX@XXX kangaroo]$ pip install django==1.10.
  2. (kangaroo.env) [XXX@XXX kangaroo]$ pip install celery==3.1.
  3. (kangaroo.env) [XXX@XXX kangaroo]$ pip install django-celery==3.2.

我在安装的时候写明了版本号,是因为这套版本号在我们的生产环境过玩转过。

如果你换了对应的版本号的话,可能会引发冲突,出现意想不到的问题。亲测还是有一些版本之间是有怪问题的。

2、创建工程

创建工程kangaroo:django-admin startproject kangaroo

  1. # 在kangaroo.env同级目录下创建工程kangaroo
    cd /home/data_monitor/yangfan/test/kangaroo
    # 创建工程kangaroo
  2. (kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ django-admin startproject kangaroo
  3. (kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ ll
  4. total
  5. drwxrwxr-x data_monitor data_monitor Aug : kangaroo
  6. drwxrwxr-x data_monitor data_monitor Aug : kangaroo.env

创建APP foot:python manage.py startapp foot

  1. # 进入工程目录,你会看到manage.py文件
  2. cd kangaroo
  3. # 创建APP foot
  4. (kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ python manage.py startapp foot
  5. (kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ ll
  6. total
  7. drwxrwxr-x data_monitor data_monitor Aug : foot
  8. drwxrwxr-x data_monitor data_monitor Aug : kangaroo
  9. -rwxrwxr-x data_monitor data_monitor Aug : manage.py
  10. # 进入foot app目录,看一下有什么
  11. (kangaroo.env) [data_monitor@bigdata-arch-client10 kangaroo]$ cd foot/
  12. (kangaroo.env) [data_monitor@bigdata-arch-client10 foot]$ ll
  13. total
  14. -rw-rw-r-- data_monitor data_monitor Aug : admin.py
  15. -rw-rw-r-- data_monitor data_monitor Aug : apps.py
  16. -rw-rw-r-- data_monitor data_monitor Aug : __init__.py
  17. drwxrwxr-x data_monitor data_monitor Aug : migrations
  18. -rw-rw-r-- data_monitor data_monitor Aug : models.py
  19. -rw-rw-r-- data_monitor data_monitor Aug : tests.py
  20. -rw-rw-r-- data_monitor data_monitor Aug : views.py

至此我们创建了工程kangaroo和app foot,下面我们介绍如何集成celery。

3、django-celery的集成配置

我们这里集成的方式是使用django-celery包。

集成配置要注意以下几个地方就好了,配置起来还是比较简单的。

1)修改kangaroo/settings.py文件

让djcelery模块生效

  1. import os
  2. import djcelery
  3. djcelery.setup_loader()
  4. ...
  5. INSTALLED_APPS = (
  6. ...
  7. 'djcelery',
  8. 'kombu.transport.django',
  9. ...
  10. )

配置broker和backend

  1. # Celery settings
  2. # redis做broker, 第二个":"前后是redis的用户名密码,后面的2是db
  3. # BROKER_URL = 'redis://:password@10.93.84.53:6379/2'
  4. # rabbitMQ做broker,第二个":"前后是rabbitMQ的用户名密码
  5. BROKER_URL = 'amqp://admin:bigdata123@10.93.21.21:5672//'
  6. # Celery的backend记录地址,这里只给出redis的配置
  7. CELERY_RESULT_BACKEND = 'redis://:bigdata123@10.93.84.53:6379/3'

4、第一个task

其实应该在创建app的时候就将appName添加到settings.py的INSTALLED_APPS中,我们没有这样做事留到现在好说明问题。

我们修改settings.py加入foot。

  1. import os
  2. import djcelery
  3. djcelery.setup_loader()
  4. ...
  5. INSTALLED_APPS = (
  6. ...
  7. 'djcelery',
  8. 'kombu.transport.django',
  9. ...
  10. 'foot',
  11. ...
  12. )

当settings.py中的djcelery.setup_loader()运行时, Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件, 找到标记为@task的function, 并将它们注册为celery task。

所以我们在foot包下创建tasks.py文件,并且添加我们的task。

foot/tasks.py

  1. # -*- coding:utf-8 -*-
  2. import time
  3. import logging
  4.  
  5. from celery import task
  6. logger = logging.getLogger(__name__)
  7.  
  8. @task()
  9. def foot_task(param_dict):
  10. logger.info('foot task start! param_dict:%s' % param_dict)
  11. time.sleep(10)
  12. logger.info('foot task finished!')
  13. return

这个task等待接收一个参数字典,只是简单的打印参数,然后sleep10s就退出了。

让task在后台worker中注册,当有任务分发下来的时候就开始执行。只需执行

  1. python manage.py celery worker --loglevel=info

5、分发任务dispatch

任务触发的两种方式:

1)定时调度,可以适用celery beat,这里没有详述,因为在实际生产中,我们使用了apschedule做了定时器。

2)请求异步执行,这里给出了例子,服务接收http请求,直接返回,任务异步的丢给worker执行。

我这里写了一个通用的函数,这个函数用于分发任务

  1. def dispatch(task, param_dict):
  2. param_json = json.dumps(param_dict)
  3. try:
  4. task.apply_async(
  5. [param_json],
  6. retry=True,
  7. retry_policy={
  8. 'max_retries': 1,
  9. 'interval_start': 0,
  10. 'interval_step': 0.2,
  11. 'interval_max': 0.2,
  12. },
  13. )
  14. except Exception, ex:
  15. logger.info(traceback.format_exc())
  16. raise

如何触发foot.tasks中的任务呢,只需要

  1. import logging
  2. import traceback
  3. from django.http import JsonResponse
  4. from django.views.decorators.csrf import csrf_exempt
  5.  
  6. from foot.tasks import foot_task
  7. from common.dispatcher import dispatch
  8.  
  9. logger = logging.getLogger(__name__)
  10.  
  11. @csrf_exempt
  12. def hello(request):
  13. if request.method == 'GET':
  14. try:
  15. user = request.GET.get('username')
  16. dispatch(test_task, {'hello': user})
  17. return JsonResponse({'code': 0, 'msg':'success'})
  18. except Exception, ex:
  19. return JsonResponse({'code: -1, 'msg': traceback.format_exc()})

1)当你在客户端发送请求:hello?username='kangaroo'时

2)服务瞬间返回:{'code': 0, 'msg':'success'}

3)后端sleep10秒后执行成功,打印hello:kangaroo

这就是异步的效果。

django celery的分布式异步之路(一) 起步的更多相关文章

  1. django celery的分布式异步之路(二) 高并发

    当你跑通了前面一个demo,博客地址:http://www.cnblogs.com/kangoroo/p/7299920.html,那么你的分布式异步之旅已经起步了. 性能和稳定性是web服务的核心评 ...

  2. Django+Celery+xadmin实现异步任务和定时任务

    Django+Celery+xadmin实现异步任务和定时任务 关注公众号"轻松学编程"了解更多. 一.celery介绍 1.简介 [官网]http://www.celerypro ...

  3. Django+Celery+Redis实现异步任务(发送邮件)

    安装如下依赖库 pip install Celery pip install django-celery pip install django-redis 还要安装本地的Redis服务 setting ...

  4. django+celery+ RabbitMQ实现异步任务实例

    背景   django要是针对上传文件等需要异步操作的场景时,celery是一个非常不错的选择.笔者的项目就是使用了这个组合,这里就做一个备忘吧. 安装RabbitMQ   这个安装及使用我已经在前一 ...

  5. 如何使用django+celery+RabbitMQ实现异步执行

    1)安装需要安装RabbitMQ.Celery和Django-celeryCelery和Django-celery的安装直接pip就好 2)修改settings.py在INSTALLED_APPS中加 ...

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

    http://www.yu180.com/group/view/259 推荐一个解决框架 https://github.com/maccman/juggernaut Realtime server p ...

  7. Django --- celery异步任务与RabbitMQ模块

    一 RabbitMQ 和 celery 1 celery Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务, ...

  8. Python开发【模块】:Celery 分布式异步消息任务队列

    Celery 前言: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个 ...

  9. Django中Celery http请求异步处理(四)

    Django中Celery http请求异步处理 本章延续celery之前的系列 1.settings配置 2.编写task jib_update_task任务为更新salt jid数据 3.url设 ...

随机推荐

  1. vim文本基础

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  2. 九度OJ 1014 排名

    #include <iostream> #include <string.h> #include <sstream> #include <math.h> ...

  3. bootstrap 表单+按钮+对话框

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. 【1414软工助教】团队作业4——第一次项目冲刺(Alpha版本) 得分榜

    题目 团队作业4--第一次项目冲刺(Alpha版本) 作业提交情况情况 所有团队都在规定时间内完成了七次冲刺. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目 ...

  5. 【Alpha阶段】第五次 Scrum Meeting

    每日任务 1.本次会议为第 五次 Meeting会议: 2.本次会议在上午09:35,大课间休息时间在陆大召开,召开本次会议为20分钟,汇报自己的任务和讨论接下来的任务: 一.今日站立式会议照 二.每 ...

  6. 201521123082 《Java程序设计》第7周学习总结

    201521123082 <Java程序设计>第7周学习总结 标签(空格分隔): Java 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ...

  7. java继承中的初始化顺序

    初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类 ...

  8. 团队作业8——第二次项目冲刺(Beta阶段)--第二天

    团队作业8--第二次项目冲刺(Beta阶段)--第二天 会议照片: 燃尽图: 项目进展: 今天完成了记录用户的姓名,其他的任务还在跟进. 团队贡献比: 队员 角色 团队贡献比 陈麟凤 PM 16% 张 ...

  9. 201521123019 《Java程序设计》第7周学习总结

    1. 本章学习总结 2. 书面作业 Q1.ArrayList代码分析 1.1解释ArrayList的contains源代码 源代码如下: public boolean contains(Object ...

  10. 201521123070 《JAVA程序设计》第1周学习总结

    本周学习总结 1.认识了三大平台Java SE.Java EE.Java ME. 2.认识了解了JDK,JVM与JRE,且熟悉JDK的操作并下载安装. 3.学会用博客写作业了. 书面作业 Q1.为什么 ...