Django Celery与Redis的集成指南

2023-04-11 00:00:00 django 集成 指南

Django Celery 和 Redis 是两个非常强大的工具,用于构建高性能的分布式应用程序。Django Celery 是基于 Python 的分布式任务队列,而 Redis 是一个开源的内存数据库。下面是 Django Celery 和 Redis 的集成指南:

1.安装必要的包

首先,需要安装 Django 和 Celery。在安装 Celery 时,还需要安装 Celery 的 Redis 后端。

pip install django celery celery[redis]

2.设置 Django Celery

在 Django 的 settings.py 中添加以下代码:

# Configure Django Celery
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'

# Specify the default Django app for Celery
CELERY_APP = 'your_app_name'

此代码将告诉 Celery 使用 Redis 作为其消息代理和结果后端。它还指定了默认的 Django 应用程序。

3.编写一个任务

现在,我们可以编写一个任务并将其提交给 Celery。在你的 Django 应用程序的某个位置,添加以下代码:

import time
from celery import shared_task


@shared_task
def long_running_task(text):
    time.sleep(10)
    print(text)
    return "Task finished."

这个任务只是一个简单的休眠器,演示长时间运行的任务。在实际应用中,可以执行更具体的任务,例如从数据库中检索大量数据。注意,任务被装饰为 shared_task,这使得它可以在 Django 中直接引用。

4.将任务提交到 Celery

现在,我们需要在 Django 中调用此任务,并将其作为异步任务提交给 Celery。在你的视图函数或其他位置,添加以下代码:

from django.shortcuts import render
from .tasks import long_running_task


def my_view(request):
    text = "pidancode.com"
    result = long_running_task.delay(text)
    return render(request, 'template.html', {'task_id': result.task_id})

在这里,我们定义了一个视图函数,该函数接收来自用户的请求,并将 'pidancode.com' 字符串传递给我们的任务。然后,我们调用 long_running_task.delay 函数,开始异步运行此任务,并返回任务 ID。我们可以将任务 ID 传递回模板,以便在稍后的时间内查看任务的状态。

5.监视任务的状态

有多种方法可以监视 Celery 任务的状态和进度。一种简单的方法是使用 Django 的视图函数,以 JSON 格式返回任务的当前状态。添加以下代码:

from celery.result import AsyncResult
from django.http import JsonResponse


def task_status(request):
    task_id = request.GET.get('task_id')
    if task_id is not None:
        task = AsyncResult(task_id)
        data = {'status': task.status, 'result': task.result}
        return JsonResponse(data)
    else:
        return JsonResponse({'error': 'No task ID provided.'})

此视图函数接收 GET 请求,其中包含任务 ID。然后,它使用 AsyncResult 获取任务的当前状态,并将其以 JSON 格式返回。

6.在 Redis 中管理 Celery

最后,我们可以使用 Redis 命令行工具(redis-cli)来管理 Celery 中的任务,例如列出当前排队的任务、删除已完成的任务等。

例如,要列出当前 Redis 中的所有任务,可以执行以下命令:

$ redis-cli
> keys celery-task-meta-*

要删除特定任务,请使用以下命令:

$ redis-cli
> DEL celery-task-meta-<task-id>

这些命令使得在处理大量 Celery 任务时,可以很容易地检查它们的状态和进度,以及在必要时对任务进行管理。

总结

通过遵循上述步骤,可以将 Django Celery 和 Redis 集成到应用程序中,从而实现高效的分布式任务队列。此外,通过结合 Django 的视图函数和 Redis 命令行工具,可以方便地监视和管理 Celery 中的任务。

相关文章