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

"""

需安装软件:

pip install celery

sudo apt-get install redis-server

一、Django加入Celery

现打开首页要执行一个收集访客数据,发送邮件等操作。这是一个耗时任务,若放在home处理方法中执行,用户打开首页会很慢。用户体验不好,很可能不会等到页面打开。
通常这个耗时任务可以多线程处理或者异步处理。我们模拟一个耗时任务,丢给Celery异步处理。
先模拟耗时任务,打开views.py,修改如下:
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse from .models import Blog
import json
import time def sendmail(email):
print('start send email to %s' % email)
time.sleep(5) #休息5秒
print('success')
return True def home(request):
#耗时任务,发送邮件
sendmail('test@test.com') #其他行为
data = list(Blog.objects.values('caption'))
return HttpResponse(json.dumps(data), content_type = 'application/json')
"""
二、在settings.py同级目录添加celery.py
#coding:utf-8
from __future__ import absolute_import, unicode_literals from celery import Celery
from django.conf import settings
import os #设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_django.settings') #实例化Celery
app = Celery('test_django') #使用django的settings文件配置celery
app.config_from_object('django.conf:settings') #Celery加载所有注册的应用
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 三、这个文件还没被加载,接着打开settings.py同个目录下的__init__.py文件。让运行该Django项目的时候,加载该文件配置Celery。修改代码如下:
#coding:utf-8
from __future__ import absolute_import, unicode_literals #引入celery实例对象
from .celery import app as celery_app 四、
还需在settings.py中设置celery,尤其是中间人的设置。若不设置中间人,会提示无法连接中间人的错误。在settings.py文件中添加如下设置:
#celery settings
#celery中间人 redis://redis服务所在的ip地址:端口/数据库号
BROKER_URL = 'redis://localhost:6379/0'
#celery结果返回,可用于跟踪结果
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' #celery内容等消息的格式设置
CELERY_ACCEPT_CONTENT = ['application/json',]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json' #celery时区设置,使用settings中TIME_ZONE同样的时区
CELERY_TIMEZONE = TIME_ZONE 五、4、把耗时任务丢给celery处理 上面views.py中有个耗时任务sendmail。在myapp应用中新建文件tasks.py,将sendmail方法剪切到该文件中并用定义为celery任务。tasks.py文件如下代码:
#coding:utf-8
from celery.decorators import task
import time @task
def sendmail(email):
print('start send email to %s' % email)
time.sleep(5) #休息5秒
print('success')
return True 在原有的方法上加上celery装饰器task。或者也可以通过前面添加的celery_app给sendmail方法加装饰器:
#coding:utf-8
#myproject是当前django的项目名
from myproject import celery_app
import time @celery_app.task
def sendmail(email):
print('start send email to %s' % email)
time.sleep(5) #休息5秒
print('success')
return True 另外原先的views.py修改如下:
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse from .models import Blog
from .tasks import sendmail #引用tasks.py文件的中sendmail方法
import json def home(request):
#耗时任务,发送邮件(用delay执行方法)
sendmail.delay('test@test.com') #其他行为
data = list(Blog.objects.values('caption'))
return HttpResponse(json.dumps(data), content_type = 'application/json') 接着,启动celery worker。这个worker是用于异步执行任务的“工作者”。进入manage.py文件所在的目录,执行如下命令:
celery -A myproject worker -l info
或者celery -A myproject worker -l debug

最新文章

  1. 8个超棒的HTML5网站设计欣赏
  2. VIM 常用快捷键
  3. PHP的运行机制与原理(底层) [转]
  4. windows加入path路径
  5. Java中的字符串常量池
  6. html5中manifest特性测试
  7. hdu 5690 2016"百度之星" - 初赛(Astar Round2A) All X 快速二次幂 || 寻找周期
  8. Codeforces 629C Famil Door and Brackets DP
  9. codevs 4511 信息传递(NOIP2015 day1 T2)
  10. C#中方法Show.和ShowDialog的使用区别
  11. jQuery ui背景色动态渐变导航菜单
  12. Spring MVC JSON 实现JsonSerializer Date类型转换
  13. 【C++】智能指针详解(一):智能指针的引入
  14. CouchDB 简单HTTP接口使用说明
  15. ajax实现给JavaScript中全局变量赋值(转)
  16. Web API、WCF和Web Service的区别
  17. 3. Python3 基本数据类型
  18. [转]mysql中的字符串的拼接
  19. December 03rd 2016 Week 49th Saturday
  20. hasura graphql 引擎基本试用

热门文章

  1. ADB常用指令
  2. CSS实现自适应下保持宽高比
  3. 寻找完全数(C++)
  4. Python 把两个列表遍历为一个
  5. DFS——hdu1016Prime Ring Problem
  6. winform自动最大化(在不同分辨率情况下)
  7. 安装floodlight遇到的问题和解决
  8. 最短路径——Bellman-Ford算法以及SPFA算法
  9. 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api
  10. html框架集 target