2015-06-25

在django中,如果在request中做一个费时的动作,会给用户带来非常不好的体验,所以考虑用一部的任务队列来实现。 celery是一个不错的分布式任务队列,在3.1版本之前需要安装django-celery来和django进行整合,最新版本已经可以只安装celery来进行一些简单的任务了。

通过pip安装celery模块:

pip install celery==3.1.18

一个标准的django工程应该有如下目录

- proj/
  - proj/__init__.py
  - proj/settings.py
  - proj/urls.py
- manage.py

添加 proj/proj/celery.py

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', 'proj.settings')

from django.conf import settings

app = Celery('proj')

# 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)) 

在proj/proj/init.py里添加:

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app 

然后就可以在应用app里编写自己的tasks.py,例如demoapp/tasks.py:

from __future__ import absolute_import

from celery import shared_task

@shared_task
def add(x, y):
    return x + y

注意:这里并没有存储分布式任务的结果,如果你想把结果存在django数据库里,需要安装django-celery。

RabbitMQ 是默认的中间人,所以除了需要你要使用的中间人实例的 URL 位置, 它并不需要任何额外的依赖或起始配置:

BROKER_URL = ‘amqp://guest:guest@localhost:5672//’

在服务器上启动celery

celery -A proj worker -l info

在你的app里调用一下task.py里的任务试试吧

from .tasks import add
add.delay(1,1)

参考资料: