Django Celery
在现代 Web 应用中,许多任务(如发送电子邮件、处理图像或执行复杂的计算)可能需要较长时间才能完成。如果这些任务在请求-响应周期中同步执行,可能会导致用户体验变差,甚至超时。Django Celery 是一个强大的工具,可以帮助我们处理这些异步任务和定时任务,从而提升应用的性能和可扩展性。
什么是 Celery?
Celery 是一个分布式任务队列,用于处理异步任务和定时任务。它允许你将耗时的任务放入队列中,由后台的工作进程(worker)异步执行。Celery 可以与 Django 无缝集成,成为 Django 应用中处理异步任务的理想选择。
核心概念
- 任务(Task):Celery 中的基本执行单元。任务是一个函数,可以被异步调用。
- 队列(Queue):任务被放入队列中,等待工作进程处理。
- 工作进程(Worker):负责从队列中取出任务并执行。
- 消息代理(Broker):用于在任务生产者(Django 应用)和工作进程之间传递消息。常用的消息代理包括 Redis 和 RabbitMQ。
安装与配置
1. 安装 Celery 和 Redis
首先,确保你已经安装了 Django。然后,使用 pip 安装 Celery 和 Redis:
pip install celery redis
2. 配置 Django 项目
在 Django 项目的 settings.py
文件中,添加以下配置:
# settings.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
3. 创建 Celery 应用
在 Django 项目的根目录下创建一个 celery.py
文件,并添加以下内容:
# celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
app = Celery('your_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
4. 在 __init__.py
中导入 Celery 应用
在 Django 项目的 __init__.py
文件中,添加以下内容:
# __init__.py
from .celery import app as celery_app
__all__ = ('celery_app',)
创建并执行异步任务
1. 定义任务
在 Django 应用的 tasks.py
文件中,定义一个简单的任务:
# tasks.py
from celery import shared_task
@shared_task
def send_email(to, subject, message):
# 模拟发送电子邮件
print(f"Sending email to {to} with subject '{subject}' and message '{message}'")
return f"Email sent to {to}"
2. 调用任务
在 Django 视图或其他地方调用任务:
# views.py
from django.http import JsonResponse
from .tasks import send_email
def send_email_view(request):
send_email.delay("user@example.com", "Hello", "This is a test email")
return JsonResponse({"status": "Email sent"})
3. 启动 Celery Worker
在终端中启动 Celery Worker:
celery -A your_project worker --loglevel=info
4. 测试任务
访问 send_email_view
对应的 URL,你会看到任务被放入队列并由 Celery Worker 执行。