继上回安装和使用Redis之后,看看如何在Django中使用Celery。Celery是Python开发分布式任务列队的处理库。可以异步分布式地异步处理任务,也可定时执行任务等等。通常我们可以在Django执行一些比较耗时的任务(例如发邮件)和后台任务(例如爬虫和更新服务器缓存)。

研究发现,在Django中使用有两种方式:

1)使用django-celery应用;

2)直接使用Celery。

1、Celery方式的选择

这里Celery的中间人,我采用Redis。也可以用Django自身和mongodb等。Celery的中间人你可以理解为在Celery执行过程中的数据支持。保存列队记录、执行记录等等。安装Redis,可参考Redis在CentOS和Windows安装过程

这里还需要安装celery-with-redis,执行命令:

  1. pip install celery-with-redis

该命令会自动安装redis、celery、kombu、billiard、amqp、vine和celery-with-redis相关库。

先说说django-celery的方式吧。这种方式就是通过manage.py启动celery。通常先被提到的方案是不会采用。用pip安装django-celery,在settings引用djcelery应用。再更新数据库:

  1. python manage.py makemigrations djcelery
  2. python manage.py migrate djcelery

查看数据库,会发现多了很多相关的表。

稍稍有些强迫症的我,不能接受这些表脏我的数据库。另外djcelery还有个用途是在admin后台动态添加定时任务。这个功能也是比较鸡肋,维护不方便而且可能造成各种不可预知的问题。

所以建议直接使用Celery管理Django中的任务。这种方式也是Celery官网推荐的方式,可看官网的示例:Celery官网(Celery 3.x版)

2、Django简单项目准备

这里我也简单做一个示例。

首先,确保celery和redis已经安装好了,并且已经启动了Redis服务。

另外,有个已经搭建好了Django项目。作为示例,简单project和简单app如下:

为了测试,一切从简。views.py写了一个响应方法:

 #coding:utf-
from django.shortcuts import render
from django.http import HttpResponse from .models import Blog
import json def home(request):
data = list(Blog.objects.values('caption'))
return HttpResponse(json.dumps(data), content_type = 'application/json')

django项目的urls.py加了一条首页的url路由设置:

 #coding:utf-
from django.conf.urls import url
from django.contrib import admin
from myapp. urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', 'myapp.views.home', name='home')
]

运行django项目:

python manage.py runserver

3、Django加入Celery

现打开首页要执行一个收集访客数据,发送邮件等操作。这是一个耗时任务,若放在home处理方法中执行,用户打开首页会很慢。用户体验不好,很可能不会等到页面打开。

通常这个耗时任务可以多线程处理或者异步处理。我们模拟一个耗时任务,丢给Celery异步处理。

先模拟耗时任务,打开views.py,修改如下:

 #coding:utf-
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秒
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')

如此一来,至少需要再多等待5秒,才可以打开网页。

打开settings.py所在的文件夹,新建celery.py文件。加入如下代码(注意,因为celery-with-django版本限制,我安装的celery版本为3.1.25。可能celery4.x的版本代码不同):

 #coding:utf-
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秒
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同个目录下的__init__.py文件。让运行该Django项目的时候,加载该文件配置Celery。修改代码如下:

 #coding:utf-
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-
from celery.decorators import task
import time @task
def sendmail(email):
print('start send email to %s' % email)
time.sleep() #休息5秒
print('success')
return True

在原有的方法上加上celery装饰器task。或者也可以通过前面添加的celery_app给sendmail方法加装饰器:

 #coding:utf-
#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秒
print('success')
return True

另外原先的views.py修改如下:

 #coding:utf-
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')

5、本地启动celery并测试

启动celery之前,确保已经安装redis和启动redis服务,可参考Redis在CentOS和Windows安装过程

本地开发环境运行redis-cli看是否可以正常连接,若不行,再手工执行redis-server命令并保持窗口即可。

接着,启动celery worker。这个worker是用于异步执行任务的“工作者”。进入manage.py文件所在的目录,执行如下命令:

Celery -A myproject worker -l info

出现如下窗口和消息,则正常执行。

celery worker会扫描django项目中有哪些task任务,并加入进来。

最后,再启动django服务器。这个大家熟悉的python manage.py runserver。

打开首页,可以发现没有5秒等待立即得到首页内容。查看celery worker,可看到执行sendmail方法的消息。

celery在Django中的集成使用的更多相关文章

  1. Celery在Django中的使用介绍

    Celery在Django中的使用介绍 Celery简介 celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必须工具. 它是一个专注于实时处理的任务队列,同时也 ...

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

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

  3. celery在Django中的应用

    这里不解释celery,如果不清楚可以参考下面链接: http://docs.celeryproject.org/en/latest/getting-started/introduction.html ...

  4. Django 中使用 Celery

    起步 在 <分布式任务队列Celery使用说明> 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能.本文介绍如何在 Django 中使用 Celery. 安装 ...

  5. Django中Celery的实现介绍(一)

    Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...

  6. Django中使用Celery

    一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...

  7. 分布式队列celery 异步----Django框架中的使用

    仅仅是个人学习的过程,发现有问题欢迎留言 一.celery 介绍 celery是一种功能完备的即插即用的任务对列 celery适用异步处理问题,比如上传邮件.上传文件.图像处理等比较耗时的事情 异步执 ...

  8. Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示

    解决办法: 在项目 proj/proj/celery.py文件中,看到下面这行配置: celery_app.config_from_object('django.conf:settings', nam ...

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

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

随机推荐

  1. Python 装饰器(进阶篇)

    装饰器是什么呢? 我们先来打一个比方,我写了一个python的插件,提供给用户使用,但是在使用的过程中我添加了一些功能,可是又不希望用户改变调用的方式,那么该怎么办呢? 这个时候就用到了装饰器.装饰器 ...

  2. 科学计算三维可视化---Traits属性的功能

    Traits属性的功能 Traits库为python的属性增加了类型定义的功能,除此之外他还提供了5个特殊的功能(可以为用户的界面响应提供基本能力):初始化:每个traits属性都有自己的默认值验证: ...

  3. 科学计算三维可视化---TVTK管线与数据加载(用IVTK根据观察管线)

    一:用IVTK根据观察管线 (一)引入该工具 from tvtk.tools import ivtk 可能需要安装pygments pip3 install pygments (二)使用ivtk显示立 ...

  4. MinGW安装设置

    From:http://www.cnblogs.com/killerlegend/p/3746504.html Author:KillerLegend Date:2014.5.22 不得不吐槽一下学校 ...

  5. IOC轻量级框架之Autofac

    http://www.cnblogs.com/WeiGe/p/3871451.html http://www.cnblogs.com/hkncd/archive/2012/11/21/2780041. ...

  6. 同一个IIS绑定多个Htts 站点问题

    默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口 要实现多个站点对应HTTPS只能更改IIS配置 地址:C:Windowssystem32inetsrvconfigapplicatio ...

  7. 把JS和CSS合并到1个文件

    合并JS文件和CSS文件很多人都知道,也用过,目的是为了减少请求数.但有时候我们觉的把JS合并到1个文件,CSS又合并到另外1个文件也是浪费,我们如何能把CSS和JS一起合并进1个文件了? 这里需要使 ...

  8. 连接mysql提示Establishing SSL connection without server's identity verification is not recommended错误

    Establishing SSL connection without server's identity verification is not recommended. According to ...

  9. HDU 1181 变形课 (深搜)

    题目连接 Problem Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形 ...

  10. SQL SERVER 视图优化经历

    系统中要求对HIS数据进行效益统计,因为HIS数据是需要第三方提供接口导入的,不清楚数据量大小,所以视图以业务为主未对其做性能优化(当时编写试图时就是几条简单的测试数据) 如今在项目接口实施完成后查看 ...