12.2 异步任务开发与执行
Django6异步任务开发与执行教程 - 定义、调用与查询完整指南
本教程详细讲解在Django6中如何进行异步任务开发与执行,包括使用@app.task装饰器定义任务,delay和apply_async方法调用任务,以及如何获取任务结果和查询状态,适合新人学习。
Django6异步任务开发与执行教程
1. 引言
在Django6应用中,异步任务允许您执行后台操作,如发送邮件、处理大文件或调用外部API,而不阻塞主请求,从而提高应用性能。本教程将详细介绍异步任务的定义、调用、结果获取和状态查询,使用Django与Celery结合的方式(Celery是处理异步任务的常用库)。
2. 异步任务定义(@app.task装饰器)
在Django6中,异步任务通常通过Celery实现。Celery使用装饰器@app.task或@shared_task来定义任务。
步骤1: 安装和配置Celery
首先,确保已安装Django6和Celery。通过pip安装:
pip install django celery
在Django项目的设置文件中配置Celery。创建一个新文件,如celery.py,并添加以下代码:
# celery.py
import os
from celery import Celery
# 设置Django设置模块的环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
app = Celery('your_project')
# 从Django设置中加载配置
app.config_from_object('django.conf:settings', namespace='CELERY')
# 自动发现任务
app.autodiscover_tasks()
在your_project/__init__.py中添加:
# __init__.py
from .celery import app as celery_app
__all__ = ('celery_app',)
步骤2: 定义异步任务
创建一个任务文件,如tasks.py,并使用@app.task装饰器定义任务。对于通用场景,可以使用@shared_task装饰器(Celery 5+推荐)。
# tasks.py
from celery import shared_task
from django.core.mail import send_mail
@shared_task
def send_welcome_email(email, username):
"""
异步发送欢迎邮件的任务
"""
subject = "欢迎来到我们的网站"
message = f"你好 {username}, 感谢注册!"
send_mail(subject, message, 'admin@example.com', [email])
return f"邮件已发送到 {email}"
# 或者,如果您使用app实例,可以这样定义
# @app.task
# def my_task(x):
# return x * 2
解释:@shared_task装饰器会自动与Celery应用关联,使任务可在任何地方使用。任务函数可以包含任何逻辑,如数据库操作或API调用。
3. 异步任务调用(delay、apply_async方法)
定义任务后,您可以在视图或其他地方调用它。Celery提供了delay和apply_async两种调用方式。
使用delay方法
delay是apply_async的简化版,立即启动任务并返回一个AsyncResult对象。
# views.py
from django.http import HttpResponse
from .tasks import send_welcome_email
def register_view(request):
"""
用户注册视图,调用异步任务发送邮件
"""
# 假设从请求中获取email和username
email = request.POST.get('email', 'user@example.com')
username = request.POST.get('username', '张三')
# 调用异步任务
task_result = send_welcome_email.delay(email, username)
return HttpResponse(f"注册成功!任务ID: {task_result.id}")
delay方法接收任务函数所需的参数,并立即在后台运行任务。
使用apply_async方法
apply_async方法提供更多选项,如延迟执行或设置优先级。
# 在视图或其他地方调用
from .tasks import send_welcome_email
# 调用任务,设置延迟10秒执行
result = send_welcome_email.apply_async(args=[email, username], countdown=10)
# 可以添加更多选项,如队列、优先级等
# result = send_welcome_email.apply_async(args=[email, username], countdown=10, queue='high')
参数说明:
args: 任务参数列表。countdown: 延迟执行的时间(秒)。- 其他选项如
queue用于指定任务队列。
4. 异步任务结果获取与状态查询
调用任务后,您可能需要检查任务状态或获取结果。通过AsyncResult对象(由delay或apply_async返回)来实现。
获取任务结果
任务完成后,可以获取返回值。使用get方法,但注意它可能会阻塞直到任务完成。
# 示例:在视图或管理命令中获取结果
from celery.result import AsyncResult
from .tasks import send_welcome_email
# 假设 task_result 是之前调用返回的AsyncResult对象
task_result = send_welcome_email.delay('user@example.com', '李四')
# 检查任务是否完成
if task_result.ready():
# 获取结果
try:
outcome = task_result.get(timeout=5) # 设置超时时间,防止无限等待
print(f"任务结果: {outcome}")
except Exception as e:
print(f"任务失败: {e}")
else:
print("任务还在运行中,请稍后再检查。")
ready(): 检查任务是否已完成(成功或失败)。get(): 获取任务结果,如果任务未完成,它会阻塞直到完成或超时。
查询任务状态
通过AsyncResult的state属性查询任务状态。
# 查询任务状态
status = task_result.state
print(f"任务状态: {status}")
# 常见状态:
# - PENDING: 任务等待执行
# - STARTED: 任务已开始执行
# - SUCCESS: 任务成功完成
# - FAILURE: 任务失败
# - RETRY: 任务重试中
您还可以使用id属性获取任务ID,用于后续查询:
task_id = task_result.id
# 如果需要从其他地方查询,可以使用AsyncResult实例化新对象
from celery.result import AsyncResult
app = Celery('your_project')
result = AsyncResult(task_id, app=app)
print(result.state)
5. 总结
本教程涵盖了Django6中异步任务的全过程:
- 定义:使用
@app.task或@shared_task装饰器在tasks.py中定义任务。 - 调用:通过
delay或apply_async方法在视图中调用任务,实现后台执行。 - 结果获取与状态查询:利用AsyncResult对象的
get()和state属性管理任务生命周期。
异步任务能显著提升Django应用的响应速度和可扩展性。建议实践这些示例,并结合Celery的监控工具(如Flower)进行更高级的管理。如有问题,参考Django和Celery官方文档。
希望这篇教程对您入门Django6异步任务有所帮助!