上一篇已经介绍了celery的基本知识,本篇以一个小项目为例,详细说明django框架如何集成celery进行开发。
本系列文章的开发环境:
1
|
window 7 + python2.7 + pycharm5 + celery3.1.25 + django1.9.4
|
在web应用中,用户触发一个操作,执行后台处理程序,这个程序需要执行很长时间才能返回结果。怎样才能不阻塞http请求,不让用户等待从而提高用户体验呢?这是本例需要解决的问题。具体设计是:用两个网页进行展示,一个网页是提交加法计算任务到后台进行计算;另外一个网页查看所有计算任务的详细情况,如任务ID,任务状态等。
就如下图所示:输入:http://127.0.0.1:8000/index/
点击查看任务链接,查看所有任务的执行情况:sucess表示执行成功,started表示已经开始执行了。
二、项目结构
Broker我这里选择RabbitMQ,结果存储Backend我选择django-celery。
三、开始编程
1、安装django-celery:
1
|
$ pip install django-celery
|
2、新建django工程项目test_celery,如下:
【说明】:tools是django包,和test_celery是同级目录,该包功能主要存放工具类函数和执行的任务;
celery.py:celery配置文件信息
3、编辑setting.py,添加配置celery broker和backend
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#celery setting
import djcelery
djcelery.setup_loader() #加载djcelery
BROKER_URL = 'pyamqp://guest@localhost//' #配置broker
BROKER_POOL_LIMIT = 0
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend' #配置backend
INSTALLED_APPS = [
'django.contrib.admin' ,
'django.contrib.auth' ,
'django.contrib.contenttypes' ,
'django.contrib.sessions' ,
'django.contrib.messages' ,
'django.contrib.staticfiles' ,
'djcelery' , #django-celery必须添加
'test_celery' ,
]
DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.mysql' , 'NAME' : 'celery' , 'USER' : 'username' , 'PASSWORD' : 'password' , 'HOST' : 'ip' , 'PORT' : 3306 , }}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault( 'DJANGO_SETTINGS_MODULE' , 'test_celery.settings' )
from django.conf import settings # noqa
app = Celery( 'test_celery' )
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object( 'django.conf:settings' )
app.autodiscover_tasks( lambda : settings.INSTALLED_APPS)
@app .task(bind = True )
def debug_task( self ):
print ( 'Request: {0!r}' . format ( self .request))
|
1
2
3
4
5
6
7
8
|
from __future__ import absolute_import
from celery import shared_task
import time
@shared_task (track_started = True )
def add(x, y):
time.sleep( 30 ) #模拟长时间执行
return x + y
|
1
2
3
4
5
6
7
|
from django.db import models
#在数据库中生成test_celery_add表
class Add(models.Model):
task_id = models.CharField(max_length = 128 ) #存储taskid
first = models.IntegerField() #存储第一个加数
second = models.IntegerField() #存储第二个加数
log_date = models.DateTimeField() #存储开始时间
|
1
2
|
python manage.py makemigrations test_celery
python manage.py migrate
|
到这里会在数据库中生成以下表:
8、接下来编写前端html文件以及view文件,具体请自己编写或者下载源码运行。
9、编码完成后,启动worker,然后就可以在网页上进行模拟操作了
进入test_celery项目目录下,也就是有manage.py文件那一层,执行以下命令启动worker:
1
|
celery worker -A test_celery -l info
|
原文链接:http://www.cnblogs.com/mysql-dba/p/6895190.html