Django 1.5.4 专题23 Celery RabbitMQ

来源:互联网 发布:监控安装设计软件 编辑:程序博客网 时间:2024/05/16 06:33

celery(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。

celery用于生产系统每天处理数以百万计的任务。

celery是用Python编写的,但该协议可以在任何语言实现。它也可以与其他语言通过webhooks实现。

建议的消息代理RabbitMQ

一.安装

aptitude install rabbitmq-serverrabbitmqctl add_user mike cheeserabbitmqctl add_vhost /django_tutorialsrabbitmqctl set_permissions -p /django_tutorials mike ".*" ".*" ".*"/etc/init.d/rabbitmq-server stop/etc/init.d/rabbitmq-server startpip install celery django-celery

二.新建app

manage.py startapp celery_test

三.修改settings.py


二.修改celery_test/models.py

from django.db import modelsclass CounterModel(models.Model):    count = models.IntegerField(default=0)        def __unicode__(self):        return unicode(self.count)

三.修改celery_test/tasks.py

from celery.task import taskfrom celery import current_taskfrom celery_test.models import CounterModelfrom time import sleep@task()def add_two_numbers(a, b):    """This is where you do the bulk of the your queued task needs to do"""    sleep(10)    count = CounterModel.objects.create(count = a + b)    return count@task()def do_something_long():    for i in range(100):        sleep(0.2)        current_task.update_state(state="PROGRESS", meta={'current':i, 'total':100})

四.运行

manage.py schemamigration celery_test --initialmanage.py migratemanage.py celeryd -l infomanage.py shell 

运行celeryd -l info 要保存窗口状态,另外打开新窗口


五.修改django_test/views.py

from django.http import HttpResponseRedirect,HttpResponsefrom celery.result import AsyncResultfrom celery_test.tasks import do_something_longfrom django.core.urlresolvers import reversefrom django.utils import simplejson as jsondef start_celery_task(request):    task = do_something_long.delay()        return HttpResponseRedirect( "%s%s" % ('/celery_progress?task_id=', task.id) )        def monitor_celery_task(request):    if 'task_id' in request.GET:        task_id = request.GET['task_id']    else:        return HttpResponse('No task_id passed.')    task = AsyncResult(task_id)    data = task.result or task.state    return HttpResponse(json.dumps(data), mimetype='application/json') 


六.修改django_test/urls.py

url(r'^celery_test/', 'django_test.views.start_celery_task'),url(r'^celery_progress/', 'django_test.views.monitor_celery_task'),