0

0

Python服务器编程:使用django-celery进行任务队列

王林

王林

发布时间:2023-06-18 17:09:11

|

1741人浏览过

|

来源于php中文网

原创

python服务器编程:使用django-celery进行任务队列

随着Web应用程序的日益流行和用户数量的增加,现代Web应用程序需要通过处理复杂且时间敏感的任务来保持生产力和稳定性。从电子商务网站上的订单处理和系统日志文件的处理到计算机视觉和自然语言处理的高级应用,这些任务需要独立的进程来处理。

常规做法是使用 cron 或者类似的作业调度器,但存在以下问题:

  • 难以动态管理和分配任务。
  • 难以重试失败的任务。
  • 无法轻松地将任务分发到多个服务器。
  • 无法跟踪和监控作业和任务的状态。

因此,为了解决这些问题,我们需要一种任务队列服务。

在Python生态系统中,Celery是最常用的任务队列。它是一种面向分布式系统设计的任务队列,适用于高并发,高吞吐量的Web应用程序。

立即学习Python免费学习笔记(深入)”;

在本文中,我们将介绍如何使用Celery和Django开发任务队列服务。我们将使用Django-Celery作为Celery的Django集成。

  1. 安装相关依赖

首先,我们需要将Celery和Django-Celery的依赖项安装到项目中。您可以使用pip工具来安装它们。

pip install celery django-celery

  1. 配置Celery

在我们开始使用Celery之前,我们需要配置Celery。为此,请创建一个名为celery.py的文件,该文件应该位于您的项目的根目录中。该文件的内容如下:

from __future__ import absolute_import, unicode_literals

import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'example.settings')

app = Celery('example')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

注意:如果您希望使用在settings.py文件中指定的配置来配置Celery,请将'example.settings'替换为实际的Django项目名称。

  1. 配置Django

现在,我们需要在settings.py文件中配置Django,以便它支持Celery。

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

CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

# app注册
INSTALLED_APPS = (
    ...
    'django_celery_results',
    'django_celery_beat',
    ...
)

在这里,我们配置了两个关键设置。(1)CELERY_BROKER_URL – 这告诉Celery使用Redis作为其中间件服务。(2)INSTALLED_APPS – 我们需要在我们的应用程序中注册Django-Celery的两个应用程序。

站长俱乐部购物系统
站长俱乐部购物系统

功能介绍:1、模块化的程序设计,使得前台页面设计与程序设计几乎完全分离。在前台页面采用过程调用方法。在修改页面设计时只需要在相应位置调用设计好的过程就可以了。另外,这些过程还提供了不同的调用参数,以实现不同的效果;2、阅读等级功能,可以加密产品,进行收费管理;3、可以完全可视化编辑文章内容,所见即所得;4、无组件上传文件,服务器无需安装任何上传组件,无需支持FSO,即可上传文件。可限制文件上传的类

下载
  1. 创建一个任务

现在我们已经配置好了Celery和Django,我们可以开始定义一些任务了。我们将创建一个示例任务来演示任务的结构和语法。在app/tasks.py文件中,添加以下内容。

from django.core.mail import send_mail
from celery import shared_task
from datetime import datetime


@shared_task
def send_email_task():
    subject = 'Celery Email Demo'
    message = 'This email is sent using celery!'
    from_email = 'demo@example.com'
    recipient_list = ['recipient@example.com']
    send_mail(subject, message, from_email, recipient_list)

    print('Email Sent Successfully')
    return None


@shared_task
def print_time():
    now = datetime.now()
    current_time = now.strftime("%H:%M:%S")
    print("Current Time =", current_time)

    return None

在这里,我们定义了两个任务。它们分别是send_email_task和print_time任务。注意这一点,我们将任务修饰为shared_task装饰器。这使得我们的任务可以在任何地方访问,使它们可以被多个进程调用。

  1. 启动Worker进程

现在,我们已经定义了任务,我们需要启动worker进程并告诉它们执行哪些任务。

打开一个终端窗口,并输入以下命令:

$ celery -A example worker --loglevel=info

注意,example代表Django项目的名称。在这里,我们使用--loglevel = info来控制worker的日志级别。

  1. 通过Django管理界面调度任务

Django-Celery支持在Django Admin界面中管理和调度任务。我们需要注册Django-Celery的两个应用程序。我们可以在admin.py文件中添加以下代码。

from django.contrib import admin
from django_celery_beat.admin import PeriodicTaskAdmin, IntervalScheduleAdmin
from django_celery_results.models import TaskResult
from django_celery_results.admin import TaskResultAdmin
from core.tasks import send_email_task, print_time


class Tasks(admin.ModelAdmin):
    actions = ['send_email_task', 'print_time']

    def send_email_task(self, request, queryset):
        send_email_task.delay()

    send_email_task.short_description = "Send Email Task"

    def print_time(self, request, queryset):
        print_time.delay()

    print_time.short_description = "Print Current Time"


admin.site.unregister(TaskResult)
admin.site.register(TaskResult, TaskResultAdmin)
admin.site.register(IntervalSchedule, IntervalScheduleAdmin)
admin.site.register(PeriodicTask, PeriodicTaskAdmin)
admin.site.register(Tasks)

在这里,我们将我们的任务添加到admin界面中。我们可以通过点击“执行邮件任务”和“打印当前时间”按钮来执行这些任务。

现在,我们已经成功地使用Django-Celery建立了一个任务队列服务。我们可以将其用于不同的应用程序,并使用WebSocket和HTTP协议等通信协议将其分发到多个服务器中。

结论

本文介绍了如何使用Celery和Django开发任务队列服务。我们使用Django-Celery作为Celery的Django集成,并演示了如何定义任务,配置Celery,启动Worker,调度任务以及管理任务。任务队列服务提供了处理复杂和耗时的任务的一种极佳方式,并使Web应用程序的性能和可靠性更好。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

715

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

625

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

739

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1235

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

698

2023.08.11

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 7.7万人学习

ASP 教程
ASP 教程

共34课时 | 3万人学习

Python 教程
Python 教程

共137课时 | 6.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号