在 django 中使用 Celery
各位小伙伴注意,Celery大于3.1.25的版本不再支持Windows。Windows下推荐安装 3.1.25。
(因为我使用的 Windows,这里就以3.1.25为例。如果你还没有严重依赖Windows,请尽快投向Mac os 或 Linux 的怀抱。)
1.0 安装
# 安装 celery 和对 redis 的支持
pip install celery[redis]==3.1.25
2.0 先 看一下项目目录
django 项目的创建就不在说了。要确保 App 已经在 settings 的 INSTALLED_APPS 中安装。
(别问为什么说这种低级错误,我在写这个的时候新建的项目就没有安装)
3.0 开始配置Celery
3.1 在 settings 中配置 redis
# CeleryTest/settings.py
...# setting 中原有的配置
# Celery settings
BROKER_URL = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
3.2 在项目的配置文件中创建 celery.py 文件(与 settings.py 同级目录)
这个文件主要用于创建 Celery 的实例以及对 Django 的配置
在 celery.py 中写入
# CeleryTest/celery.py
# -*- coding:utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
#设置 Django 的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CeleryTest.settings')
from django.conf import settings
# 创建 celery 实例
app = Celery('CeleryTest')
# 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 中的 taks
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
3.3 配置项目的 init.py
(与settings同级的__init__.py,不是app中的__init__py)
在项目的 init.py 中写入:
# CeleryTest/__init__.py
from __future__ import absolute_import
from .celery import app as celery_app
# 这个操作是为了确保在django启动时启动 celery
celery的配置已经结束了,每当 Django 启动时会去扫描每一个已安装的 App 目录中的tasks.py文件。
4.0 App目录中的 tasks.py
# app1/tasks.py
# -*- coding:utf-8 -*-
from __future__ import absolute_import
from celery import shared_task
# 可以异步调用的函数
@shared_task
def add(x, y):
return x + y
# 定时任务
# 留坑一会填
5.0 启动 worker && beat
worker:故名思意就是一个用来执行任务的进程。
beat:只有在设置了定时任务时才需要,用于分配任务,为调度控制器。
在 命令提示符 窗口中,切换到项目目录下(与 manage.py 同级)。
# 注意:worker 与 beat 需要在不同的命令提示符中执行创建
# 创建 worker
celery -A back worker -l info
# 创建 beat
celery -A back beat -l info
在开发环境中,可以这样启动来测试。在生产环境中,应该使用 Circus 来启动。实现方法将在我之后的部署相关的文章中说明。
6.0 执行
在需要调用的文件中导入 tasks.py 中的函数,然后使用 ** 函数名.delay() **调用
# 在 view.py 中
from django.http import HttpResponse
from .tasks import add
def test(request):
# ...do somethings
add.delay()
# ...do somethings
return HttpResponse("CeleryTest")
更多参考请参阅:Celery文档