参考:http://yshblog.com/blog/163

"""

需安装软件:

pip install celery

sudo apt-get install redis-server

一、Django加入Celery

  1. 现打开首页要执行一个收集访客数据,发送邮件等操作。这是一个耗时任务,若放在home处理方法中执行,用户打开首页会很慢。用户体验不好,很可能不会等到页面打开。
  2. 通常这个耗时任务可以多线程处理或者异步处理。我们模拟一个耗时任务,丢给Celery异步处理。
  3. 先模拟耗时任务,打开views.py,修改如下:
  4. #coding:utf-8
  5. from django.shortcuts import render
  6. from django.http import HttpResponse
  7. from .models import Blog
  8. import json
  9. import time
  10. def sendmail(email):
  11. print('start send email to %s' % email)
  12. time.sleep(5) #休息5秒
  13. print('success')
  14. return True
  15. def home(request):
  16. #耗时任务,发送邮件
  17. sendmail('test@test.com')
  18. #其他行为
  19. data = list(Blog.objects.values('caption'))
  20. return HttpResponse(json.dumps(data), content_type = 'application/json')
  21. """
  22. 二、在settings.py同级目录添加celery.py
  23. #coding:utf-8
  24. from __future__ import absolute_import, unicode_literals
  25. from celery import Celery
  26. from django.conf import settings
  27. import os
  28. #设置环境变量
  29. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_django.settings')
  30. #实例化Celery
  31. app = Celery('test_django')
  32. #使用django的settings文件配置celery
  33. app.config_from_object('django.conf:settings')
  34. #Celery加载所有注册的应用
  35. app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  36. 三、这个文件还没被加载,接着打开settings.py同个目录下的__init__.py文件。让运行该Django项目的时候,加载该文件配置Celery。修改代码如下:
  37. #coding:utf-8
  38. from __future__ import absolute_import, unicode_literals
  39. #引入celery实例对象
  40. from .celery import app as celery_app
  41. 四、
  42. 还需在settings.py中设置celery,尤其是中间人的设置。若不设置中间人,会提示无法连接中间人的错误。在settings.py文件中添加如下设置:
  43. #celery settings
  44. #celery中间人 redis://redis服务所在的ip地址:端口/数据库号
  45. BROKER_URL = 'redis://localhost:6379/0'
  46. #celery结果返回,可用于跟踪结果
  47. CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
  48. #celery内容等消息的格式设置
  49. CELERY_ACCEPT_CONTENT = ['application/json',]
  50. CELERY_TASK_SERIALIZER = 'json'
  51. CELERY_RESULT_SERIALIZER = 'json'
  52. #celery时区设置,使用settings中TIME_ZONE同样的时区
  53. CELERY_TIMEZONE = TIME_ZONE
  54. 五、4、把耗时任务丢给celery处理
  55. 上面views.py中有个耗时任务sendmail。在myapp应用中新建文件tasks.py,将sendmail方法剪切到该文件中并用定义为celery任务。tasks.py文件如下代码:
  56. #coding:utf-8
  57. from celery.decorators import task
  58. import time
  59. @task
  60. def sendmail(email):
  61. print('start send email to %s' % email)
  62. time.sleep(5) #休息5秒
  63. print('success')
  64. return True
  65. 在原有的方法上加上celery装饰器task。或者也可以通过前面添加的celery_app给sendmail方法加装饰器:
  66. #coding:utf-8
  67. #myproject是当前django的项目名
  68. from myproject import celery_app
  69. import time
  70. @celery_app.task
  71. def sendmail(email):
  72. print('start send email to %s' % email)
  73. time.sleep(5) #休息5秒
  74. print('success')
  75. return True
  76. 另外原先的views.py修改如下:
  77. #coding:utf-8
  78. from django.shortcuts import render
  79. from django.http import HttpResponse
  80. from .models import Blog
  81. from .tasks import sendmail #引用tasks.py文件的中sendmail方法
  82. import json
  83. def home(request):
  84. #耗时任务,发送邮件(用delay执行方法)
  85. sendmail.delay('test@test.com')
  86. #其他行为
  87. data = list(Blog.objects.values('caption'))
  88. return HttpResponse(json.dumps(data), content_type = 'application/json')
  89. 接着,启动celery worker。这个worker是用于异步执行任务的“工作者”。进入manage.py文件所在的目录,执行如下命令:
  90. celery -A myproject worker -l info
  91. 或者celery -A myproject worker -l debug

celey异步任务的更多相关文章

  1. Django 异步任务、定时任务Celery

    将任务分配给其他的进程去运行,django的主进程只负责发起任务,而执行任务的不在使用django的主进程.Python有一个很棒的异步任务框架,叫做celery. Django为了让开发者开发更加方 ...

  2. Celery---一个懂得异步任务,延时任务,周期任务的芹菜

    Celery是什么? celey是芹菜 celery是基于Python实现的模块,用于执行异步延时周期任务的 其结构组成是由 1.用户任务 app 2.管道任务broker用于存储任务 官方推荐red ...

  3. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  4. C#异步编程(一)

    异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...

  5. redux-amrc:用更少的代码发起异步 action

    很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...

  6. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  7. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  8. 异步编程 In .NET

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  9. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

随机推荐

  1. Python全栈 MongoDB 数据库(概念、安装、创建数据)

    什么是关系型数据库?           是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,             同时也是一个被组织成一组拥有正式描述性的表格( ...

  2. 深度学习anchor的理解

    摘抄与某乎 anchor 让网络学习到的是一种推断的能力.网络不会认为它拿到的这一小块 feature map 具有七十二变的能力,能同时从 9 种不同的 anchor 区域得到.拥有 anchor ...

  3. Git的使用和部署

    Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). 什么是版本控制系统? 没有版本控制系统 有了版本控制系统 版本 文件名 用户 说明 日期 1 service.doc 张三 ...

  4. 第十一次ScrumMeeting会议

    第十一次ScrumMeeting 时间:2017/11/18 4:00-4:30 地点:主203 人员:全体人员 照片: 工作情况 名字 今日计划 明天的工作 遇到的困难 蔡帜 讨论策划详情\确定WB ...

  5. Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化

    我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...

  6. C++常用STL

    目录 C++ 常用STL整理 容器和配接器 list(链表) stack(栈) queue(队列) priority_queue(优先队列) set(集合) vector(向量) map&&a ...

  7. 【linux】linux中tree的安装

    # 2018/7/29 10:17:46测试成功! 一 Tree命令简介 tree是一种递归目录列表命令,产生一个深度缩进列表文件. 二 Tree命令安装 1.下载安装包,地址:http://mama ...

  8. CodeForces Round #521 (Div.3) D. Cutting Out

    http://codeforces.com/contest/1077/problem/D You are given an array ss consisting of nn integers. Yo ...

  9. union的代码有点难理解额

    union跟位域都可以节省内存,而且union在某些地方还能起到更好看的效果? 比如: struct Matrix { union { struct { float _f11, _f12, _f13, ...

  10. [BZOJ3473][BZOJ3277]字符串

    [BZOJ3473][BZOJ3277]字符串 试题描述 给定 \(n\) 个字符串,询问每个字符串有多少子串(不包括空串)是所有 \(n\) 个字符串中至少 \(k\) 个字符串的子串? 输入 第一 ...