Django中的定时任务与后台任务队列的实践【第164篇—Django】

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

在Web开发中,处理定时任务和后台任务队列是很常见的需求。Django作为一个功能强大的Web框架,提供了多种方式来实现这些任务。本文将介绍如何在Django中实践定时任务和后台任务队列,并提供案例代码示例。

image-20240326003240582

1. 定时任务的实现

在Django中,可以使用Celery这样的任务队列库结合Celery Beat来实现定时任务。下面是一个简单的示例:

首先,安装Celery和Celery Beat:

pip install celery

然后,配置Celery:

# settings.py

CELERY_BROKER_URL = 'amqp://guest:guest@localhost'
CELERY_RESULT_BACKEND = 'rpc://'

接着,创建一个Celery实例和定时任务:

# tasks.py

from celery import Celery

app = Celery('tasks', broker='amqp://guest:guest@localhost')

@app.task
def add(x, y):
    return x + y

运行Celery Beat:

celery -A your_project_name beat -l info

现在,你可以在你的应用程序中调用add.delay(x, y)来执行定时任务。

2. 后台任务队列的实现

在Django中,你还可以使用Django Q 这样的库来实现后台任务队列。下面是一个示例:

首先,安装Django Q:

pip install django-q

然后,将它添加到你的INSTALLED_APPS中:

# settings.py

INSTALLED_APPS = [
    ...
    'django_q',
    ...
]

接着,配置Django Q:

# settings.py

Q_CLUSTER = {
    'name': 'your_project_name',
    'workers': 4,
    'timeout': 90,
    'retry': 120,
    'queue_limit': 50,
    'bulk': 10,
    'orm': 'default',
    'save_limit': 250,
    'cpu_affinity': 1,
    'label': 'Django Q',
    'redis': {
        'host': 'localhost',
        'port': 6379,
        'db': 0,
        'password': 'your_password',
        'socket_timeout': 5,
        'retry_on_timeout': True,
        'socket_connect_timeout': 1,
        'socket_keepalive': True,
        'socket_keepalive_options': {
            'TCP_KEEPIDLE': 60,
        },
    },
}

创建一个后台任务:

# views.py

from django_q.tasks import async_task

def my_background_task():
    # 你的后台任务逻辑
    pass

def some_view(request):
    async_task(my_background_task)
    return HttpResponse('Task started!')

3. 使用示例

3.1. 定时任务示例

假设我们有一个简单的Django应用,其中有一个计算两个数之和的函数。我们希望每隔一段时间执行这个函数并将结果记录到数据库中。首先,我们创建一个模型来保存计算结果:

# models.py

from django.db import models

class CalculationResult(models.Model):
    result = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)

然后,我们使用Celery来执行定时任务:

# tasks.py

from celery import Celery
from .models import CalculationResult

app = Celery('tasks', broker='amqp://guest:guest@localhost')

@app.task
def add(x, y):
    result = x + y
    CalculationResult.objects.create(result=result)
    return result

现在,我们可以在我们的视图或其他地方调用add.delay(x, y)来执行这个定时任务。

3.2. 后台任务队列示例

image-20240326003047200

假设我们的应用程序允许用户上传大型文件,并且我们希望在后台处理这些文件以提取有用的信息,例如文件大小和文件类型。我们可以使用Django Q来处理这些后台任务:

# views.py

from django_q.tasks import async_task
from .models import UploadedFile

def process_uploaded_file(file_id):
    file_obj = UploadedFile.objects.get(id=file_id)
    # 处理文件的逻辑
    file_obj.processed = True
    file_obj.save()

def handle_uploaded_file(file):
    # 处理文件上传逻辑
    file_obj = UploadedFile.objects.create(file=file)
    async_task(process_uploaded_file, file_obj.id)

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponse('File uploaded successfully!')
    else:
        form = UploadFileForm()
    return render(request, 'upload.html', {'form': form})

在上面的例子中,当用户上传文件时,我们将文件保存到数据库中,并使用async_task将处理文件的函数放入后台任务队列中。

这段代码是一个 Django 应用的视图代码,主要实现了文件上传和异步处理上传文件的功能。我来逐步解析一下:

  1. 导入模块

    from django_q.tasks import async_task
    from .models import UploadedFile
    

    这里导入了 async_task 函数,用于执行异步任务,并导入了自定义的模型 UploadedFile,该模型似乎用于存储上传的文件信息。

  2. 定义异步任务函数

    def process_uploaded_file(file_id):
        file_obj = UploadedFile.objects.get(id=file_id)
        # 处理文件的逻辑
        file_obj.processed = True
        file_obj.save()
    

    这个函数用于处理上传的文件。通过传入的 file_id,它从数据库中获取相应的 UploadedFile 对象,然后对文件进行处理(在注释中标记为“处理文件的逻辑”),最后保存更改。

  3. 处理上传的文件函数

    def handle_uploaded_file(file):
        # 处理文件上传逻辑
        file_obj = UploadedFile.objects.create(file=file)
        async_task(process_uploaded_file, file_obj.id)
    

    这个函数用于处理上传的文件。它首先创建一个 UploadedFile 对象,将上传的文件 file 存储到数据库中,并将处理该文件的任务委派给 async_task 异步执行。在这里,async_task 调用了 process_uploaded_file 函数,传递了 file_obj.id

  4. 处理文件上传的视图函数

    def upload_file(request):
        if request.method == 'POST':
            form = UploadFileForm(request.POST, request.FILES)
            if form.is_valid():
                handle_uploaded_file(request.FILES['file'])
                return HttpResponse('File uploaded successfully!')
        else:
            form = UploadFileForm()
        return render(request, 'upload.html', {'form': form})
    

    这个函数是处理文件上传的视图函数。当收到 POST 请求时,它首先通过 UploadFileForm 校验表单数据,如果表单数据有效,则调用 handle_uploaded_file 函数来处理上传的文件,并返回一个成功上传的消息。如果收到的不是 POST 请求,它会创建一个空的表单并渲染到模板中。

总的来说,这段代码实现了一个简单的文件上传功能,它将上传的文件保存到数据库中,并通过异步任务来处理这些文件,以避免阻塞主线程。

image-20240326003106658

4. 进阶用法与注意事项

4.1. 进阶用法
4.1.1. 参数传递

在实际开发中,任务可能需要额外的参数来完成特定的工作。Celery和Django Q都支持向任务传递参数。例如,在Celery中,可以像这样调用任务:

add.delay(3, 5)

这将在后台执行add任务,并传递参数3和5给它。

4.1.2. 结果处理

有时候,我们需要获取任务执行的结果。Celery和Django Q都支持结果处理。在Celery中,可以通过AsyncResult对象来获取任务的结果:

result = add.delay(3, 5)
print(result.get())

这将打印出任务执行的结果,即8。

4.2. 注意事项
4.2.1. 性能与资源消耗

在使用定时任务和后台任务队列时,务必注意其对系统性能和资源消耗的影响。特别是在部署到生产环境时,需要对任务的执行频率、并发量以及系统资源进行合理的调优和管理,以避免对整个应用程序的性能产生负面影响。

4.2.2. 错误处理与重试机制

在编写任务函数时,务必考虑到可能出现的异常情况,并提供相应的错误处理机制。同时,Celery和Django Q都提供了重试机制,可以在任务执行失败时自动重试,但需要根据实际情况配置重试策略,以避免任务陷入死循环或导致系统负载过重。

4.3. 安全性考虑

在实践定时任务和后台任务队列时,务必考虑安全性因素。特别是在处理敏感数据或执行重要操作时,需要采取一些额外的安全措施:

4.3.1. 认证与授权

确保只有授权的用户能够访问和执行任务。在Django中,可以使用装饰器或中间件来实现认证和授权机制,以保护任务的安全性。

4.3.2. 输入验证与过滤

对任务接收的输入进行验证和过滤是至关重要的。避免直接使用用户提供的数据作为任务参数,以防止恶意输入或注入攻击。

4.3.3. 日志与监控

及时记录任务的执行日志,并建立监控机制来监视任务的执行状态和性能表现。这样可以快速发现和应对潜在的安全问题或异常情况。

4.4. 扩展与定制

定时任务和后台任务队列通常是开发中的常见需求,但在特定场景下可能需要更多的定制和扩展功能。Celery和Django Q都提供了丰富的扩展机制和插件,可以根据项目的需求进行定制化开发,以满足更复杂的任务调度和处理需求。

4.5. 部署与维护

在将应用程序部署到生产环境之前,务必考虑定时任务和后台任务队列的部署和维护问题:

4.5.1. 部署策略

选择合适的部署方式和环境来运行定时任务和后台任务队列。可以考虑使用容器化技术(如Docker)来构建和部署任务执行环境,以提高部署的灵活性和可移植性。

4.5.2. 监控与报警

建立监控系统来监视定时任务和后台任务队列的运行状态和性能指标,并设置报警机制及时发现和处理异常情况,确保任务的可靠执行和系统的稳定运行。

4.5.3. 日志与审计

定时任务和后台任务队列的执行日志是排查问题和追踪任务执行情况的重要依据。确保及时记录任务执行日志,并建立审计机制对任务执行情况进行跟踪和分析,以便及时发现和解决问题。

4.6. 版本控制与文档

定时任务和后台任务队列的代码也需要进行版本控制和文档化,以便团队成员之间协作开发和维护。建议使用版本控制工具(如Git)管理任务代码,并编写清晰详细的文档来记录任务的设计和实现细节。

4.7. 测试与质量保障

定时任务和后台任务队列的稳定性和可靠性对于应用程序的正常运行至关重要。在开发过程中,务必进行充分的测试和质量保障工作,包括单元测试、集成测试和端到端测试等,以确保任务的正确性和可靠性。

总结

本文介绍了在Django中实践定时任务与后台任务队列的全过程,涵盖了基本概念、实现方法以及进阶用法与注意事项。在开发过程中,选择合适的工具和技术对于任务的调度和执行至关重要。Celery和Django Q作为两种常用的任务调度库,分别提供了强大的功能和灵活的扩展性,可以满足不同项目的需求。在实际应用中,需要根据项目特点和实际情况选择合适的工具和策略,并结合安全性考虑、部署与维护、测试与质量保障等方面进行综合考虑和管理。

总的来说,合理地利用定时任务与后台任务队列可以提高应用程序的功能性和灵活性,增强系统的稳定性和可靠性,为用户提供更好的使用体验。希望本文能够帮助读者更好地理解和应用定时任务与后台任务队列的相关知识,并在实践中取得成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/550136.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arm64-v8a、armeabi-v7a、x86、x86_64

当我们去GitHub下载应用的时候是不是经常很懵逼,就像下图一样,粗看一下如此多安装包到底要选择下载哪个且每种安装包到底有哪差别?毕竟因为自己一无所知,有时便随意下载一个后,安装时却报『此版本与你的系统不兼容』的…

Qt---状态栏、工具栏、浮动窗口

文章目录 工具栏创建工具栏停靠位置浮动性与移动 状态栏创建状态栏并显示消息 浮动窗口创建浮动窗口设置停靠位置往浮动窗口添加内容 工具栏 工具栏是应用程序中集成各种功能实现快捷键使用的⼀个区域。 创建工具栏 工具栏与菜单栏不同,并不会自动创建&#xff0…

【网络编程】如何创建一个自己的并发服务器?

hello !大家好呀! 欢迎大家来到我的网络编程系列之如何创建一个自己的并发服务器,在这篇文章中,你将会学习到在Linux内核中如何创建一个自己的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家…

UE 录屏自动化上传阿里云OSS

前言 最近在做一个功能,然后就发现了一个很有趣的东西,虽然在一定程度上属于偷懒,但是在一些短频快的应用中还是很适用的,下面我就针对于这个测试做一些简单的分享,希望帮助到大家,在实际的开发中获得一些灵…

Java-常用API-1

Math类 public static int abs(int a) 获取绝对值public static double ceil(double a)向上取整(向数轴右边取整)public static double floor(double a)向下取整(向数轴左边取整)public static int round(float a)四舍五入public…

SQL SERVER的安装

目录 1.百度SQL SERVER找到图下的所显示的,点击进去 2.找到图下红色框起来的,点击立即下载 3.下载好之后点开,选择下载介质 4.SQLSERVER下载成功之后选择打开文件夹 6.双击后缀名是.iso的镜像文件 7.双击setup.exe进行安装 8.安装成功…

Web3D智慧医院平台(HTML5+Threejs)

智慧医院的建设将借助物联网、云计算、大数据、数字孪生等技术,以轻量化渲染、极简架构、三维可视化“一张屏”的形式,让医院各大子系统管理既独立又链接,数据相互融合及联动。 建设医院物联网应用的目标对象(人、物)都…

Java复习第二十天学习笔记(过滤器Filter),附有道云笔记链接

【有道云笔记】二十 4.8 过滤器Filter https://note.youdao.com/s/dSofip3f 一、为什么要使用过滤器 项目开发中,经常会用到重复代码的实现。 1、请求每个servlet都要设置编码 2、判断用户是否登录,只有登录了才有操作权限。 二、过滤器相关Api int…

【机器学习300问】71、神经网络中前向传播和反向传播是什么?

我之前写了一篇有关计算图如何帮助人们理解反向传播的文章,那为什么我还要写这篇文章呢?是因为我又学习了一个新的方法来可视化前向传播和反向传播,我想把两种方法总结在一起,方便我自己后续的复习。对了顺便附上往期文章的链接方…

论文笔记:(INTHE)WILDCHAT:570K CHATGPT INTERACTION LOGS IN THE WILD

iclr 2024 spotlight reviewer 评分 5668 1 intro 由大型语言模型驱动的对话代理(ChatGPT,Claude 2,Bard,Bing Chat) 他们的开发流程通常包括三个主要阶段 预训练语言模型在被称为“指令调优”数据集上进行微调&…

通过腾讯云搭建跨境电商demo的详细操作过程(建站系统 保姆级指导,巨详细)

引言: 有许多做跨境电商的朋友,或者为跨境电商服务的小企业,都会面临搭建电商平台V1.0的问题 因此,花了点时间,找了一个开源的项目,让大家可以跑起来,一方面了解平台都有哪些模块,另…

护网行动 | 蓝队应急响应流程概述

了解蓝队应急响应的流程 应急响应通常是指为了应对各种意外事件发生前所做的准备,以及在意外事件发生后所采取的措施。 网络安全应急响应是指对已经发生或可能发送的安全事件进行监控、分析、协调、处理、保护资产安全。 网络安全应急响应主要是为了让人们对网络安全…

3D模型处理的并行化

今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息,并分享我发现的一些小技巧,例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 那么我们为什么要诉诸并行计算呢? 使用数据有时会出现…

IAM 统一身份认证与访问管理服务

即统一身份认证与访问管理服务,是云服务商提供的一套云上身份管理解决方案,可帮助企业安全地管理云上资源的访问权限。 在当今云计算时代,企业越来越依赖云服务来存储和处理敏感数据。然而,这也带来了新的安全挑战,即…

ssm 体检预约管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 体检预约管理系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库, 系统主要采用B/S…

URL GET +号后台接收成空格

问题:参数spdmwhbs001 其中包含URL特殊符号 如果用GET请求方式不做任何不处理那么浏览器自动将转为%20 请求链接为 details?spdmwhbs%20001&limitKcysType1 后台接收到的参数为 whbs 001 ,自动将号转成空格了。 尝试解决(失败&#…

【Java】@RequestMapping注解在类上使用

RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到控制器(controller类)的处理方法上。 Request Mapping 基础用法 在 Spring MVC 应用程序中,RequestDispatcher (在 Front Controller 之下) 这…

git clone遇到报错“SSL certificate problem: self signed certificate”

在git clone的时候发现遇到了一个问题: cristDESKTOP-JKRNKSH MINGW64 ~/Desktop $ git clone -b dev https://xxx.xxx.xxx.xxx:3001/crist/AVM_V9M.git Cloning into AVM_V9M... fatal: unable to access https://xxx.xxx.xxx.xxx3001/crist/AVM_V9M.git/: SSL ce…

PSCAD|应用于输电线路故障测距的行波波速仿真分析

1 主要内容 该程序参考文献《应用于输电线路故障测距的行波波速仿真分析》,利用线路内部故障产生的初始行波浪涌达线路两端测量点的绝对时间之差值计算故障点到两端测量点之间的距离,并利用小波变换得到初始行波波头准确到达时刻,从而精准定…

WPS的JS宏如何实现全文件路径字符串中截取文件名(excel)

从全文件路径的字符串中,截取文件名称,例如: 全文件路径字符串为:C:\Windows\System32\drivers\acpi1.sys 需要截取文件名:acpi1.sys 方法如下: 1、简单的方式:把全文件路径字符串拷贝&…