首页 > 其他分享 >Celery在django中的应用

Celery在django中的应用

时间:2024-03-22 10:57:46浏览次数:27  
标签:celery py Django Celery CELERY 应用 django

Celery在Django中的应用

这个文档描述了当前稳定的Celery版本(5.3)。有关开发文档,请访问这里。

Django入门指南

在Django中使用Celery

注意:
Celery的早期版本需要单独的库来与Django协同工作,但自3.1版本起就不再是这样了。现在Django已经得到了原生支持,因此这份文档只包含了集成Celery和Django的基本方法。你将使用与非Django用户相同的API,因此建议你先阅读《Celery入门指南》,然后再回到这份教程。当你有了可运行的示例后,你可以继续阅读下一步指南。

注意:
Celery 5.3.x 支持 Django 2.2 LTS 或更高版本。如果你的 Django 版本低于 2.2,请使用 Celery 5.2.x;如果你的 Django 版本低于 1.11,请使用 Celery 4.4.x。

要在Django项目中使用Celery,你首先必须定义一个Celery库的实例(称为“应用”)
如果你有一个新的Django项目布局,如下所示:

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

那么推荐的方式是创建一个新的 proj/proj/celery.py 模块来定义 Celery 实例:
文件:proj/proj/celery.py

import os
from celery import Celery

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

app = Celery('proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

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


@app.task(bind=True, ignore_result=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

然后你需要在你的 proj/proj/init.py 模块中导入这个应用。这确保了在Django启动时加载该应用,以便稍后提到的 @shared_task 装饰器(稍后会提到)能够使用它:

proj/proj/init.py:

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

请注意,这个示例项目布局适用于较大的项目,对于简单的项目,你可以使用一个单独的模块来定义应用和任务,就像在《Celery入门指南》中那样。
让我们先来分析一下第一个模块中发生的事情,首先,我们为 celery 命令行程序设置默认的 DJANGO_SETTINGS_MODULE 环境变量:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

你不需要这一行,但它可以避免你总是将设置模块传递给 celery 程序。它必须始终在创建应用实例之前出现,就像我们接下来要做的那样:

app = Celery('proj')

这是我们库的实例,你可以拥有多个实例,但在使用Django时可能没有理由这样做。

我们还添加了Django设置模块作为Celery的配置源。这意味着你不必使用多个配置文件,而是可以直接从Django设置中配置Celery;但如果你愿意,也可以将它们分开。

app.config_from_object('django.conf:settings', namespace='CELERY')

大写命名空间意味着所有Celery配置选项必须用大写字母指定,而不是小写字母,并且以CELERY_开头,因此例如task_always_eager设置变为CELERY_TASK_ALWAYS_EAGER,broker_url设置变为CELERY_BROKER_URL。这也适用于工作者设置,例如,worker_concurrency设置变为CELERY_WORKER_CONCURRENCY。

例如,一个Django项目的配置文件可能包括:
settings.py

# Celery Configuration Options
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60

你也可以直接传递设置对象,但使用字符串更好,因为这样工作者就不必序列化对象。CELERY_ 命名空间也是可选的,但建议使用(以防止与其他Django设置重叠)。

接下来,对于可重用的应用程序来说,一种常见的做法是在单独的任务模块中定义所有任务。Celery确实有一种自动发现这些模块的方法:

app.autodiscover_tasks()

使用上述代码,Celery将自动发现所有已安装应用程序中的任务,遵循 tasks.py 约定:

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

这样你就不必手动将各个模块添加到 CELERY_IMPORTS 设置了。
最后,debug_task 示例是一个任务,用于转储其自身的请求信息。这是使用在 Celery 3.1 中引入的新的 bind=True 任务选项,以便轻松引用当前任务实例。

使用 @shared_task 装饰器

你编写的任务可能会存在于可重用的应用程序中,而可重用的应用程序不能依赖于项目本身,因此你也不能直接导入你的应用实例。
@shared_task 装饰器让你在没有任何具体应用实例的情况下创建任务:
demoapp/tasks.py

# Create your tasks here

from demoapp.models import Widget

from celery import shared_task


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)


@shared_task
def count_widgets():
    return Widget.objects.count()


@shared_task
def rename_widget(widget_id, name):
    w = Widget.objects.get(id=widget_id)
    w.name = name
    w.save()

另请参阅:
你可以在以下链接找到Django示例项目的完整源代码:https://github.com/celery/celery/tree/main/examples/django/

扩展

django-celery-results - 使用Django ORM/Cache作为结果后端

django-celery-results 扩展提供了使用 Django ORM 或 Django Cache 框架的结果后端。
要在您的项目中使用此功能,您需要遵循以下步骤:

  1. 安装 django-celery-results 库:
pip install django-celery-results
  1. 在您的Django项目的 settings.py 文件中的 INSTALLED_APPS 中添加 django_celery_results:
INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

请注意,模块名称中没有破折号,只有下划线。
3. 通过执行数据库迁移来创建Celery数据库表:

python manage.py migrate django_celery_results
  1. 配置Celery以使用django-celery-results后端。
    假设您也使用Django的 settings.py 来配置Celery,请添加以下设置:
CELERY_RESULT_BACKEND = 'django-db'

对于缓存后端,您可以使用:

CELERY_CACHE_BACKEND = 'django-cache'

我们还可以使用在django的CACHES设置中定义的缓存。

# celery setting.
CELERY_CACHE_BACKEND = 'default'

# django setting.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
    }
}

有关其他配置选项,请查看任务结果后端设置参考。

django-celery-beat - 带有管理界面的数据库支持的周期性任务。

有关更多信息,请参阅使用自定义调度器类

启动工作进程

在生产环境中,你会希望以守护进程的方式在后台运行worker - 参见守护进程化 - 但用于测试和开发时,能够使用celery worker manage命令启动一个worker实例是很有用的,就像你使用Django的manage.py runserver一样:

celery -A proj worker -l INFO

要查看完整的命令行选项列表,请使用帮助命令:

celery help

从这里去哪里

如果你想了解更多,你应该继续进行下一步教程,之后你可以阅读用户指南。

标签:celery,py,Django,Celery,CELERY,应用,django
From: https://www.cnblogs.com/ZN-225/p/18088966

相关文章

  • 芯片科技:从微观世界到现实应用的奇妙之旅
    引言:在当今数字化时代,芯片是现代科技发展的基石之一,几乎每个人都在日常生活中使用着芯片技术。无论是智能手机、电脑、汽车,还是家用电器,都离不开芯片的支持。本文将带您深入了解芯片的本质、制造工艺以及广泛应用的领域,以通俗易懂的方式揭示芯片背后的科学奥秘和技术挑战。......
  • 新能源汽车充电桩站点烟火AI识别检测算法应用方案
    新能源汽车作为现代科技与环保理念的完美结合,其普及和应用本应带给人们更加便捷和绿色的出行体验。然而,近年来新能源汽车充电火灾事故的频发,无疑给这一领域投下了巨大的阴影。这不禁让人深思,为何这一先进的交通工具在充电过程中会引发火灾事故。从技术层面来看,新能源汽车的充电系......
  • TSINGSEE青犀AI智能分析网关V4的人员摔倒检测算法及应用
    人员摔倒检测AI算法是一种基于计算机视觉和机器学习的技术,它通过对视频或图像中的人员运动进行分析,自动检测并识别出摔倒事件。该算法采用了多种技术手段,包括深度学习、目标跟踪、姿态估计等,以实现高效、准确的摔倒检测。今天我们来介绍下TSINGSEE青犀AI智能分析网关V4的人员摔倒......
  • 深入理解Django的ModelForm操作
    深入理解Django的ModelForm操作原文链接:https://www.cnblogs.com/shenjianping/p/11562148.html一、ModelForm的使用顾名思义,ModelForm就是将Model与Form进行绑定,Form有自动生成表单的作用,但是每一个forms字段需要自己手动填写,而Model就是数据库表包含了所有的数据字段。所以M......
  • 银行量子金融系统应用架构设计
    量子金融(即Financial-Quantum,简称Fin-Q),特指量子科技在金融行业中的应用。目前,量子科技中以量子保密通信、量子随机数和量子计算发展进度较快,取得了诸多阶段性重大技术突破和商用成果,这里仅以量子保密通信、量子随机数和量子计算为代表,简述国内外发展现状,以及在银行的应用前景......
  • 【WPF应用4】WPF界面对象编辑
    简介WPF(WindowsPresentationFoundation)是.NET框架的一部分,它为开发人员提供了一个用于构建桌面应用程序用户界面的强大平台。WPF界面对象编辑是指在WPF应用程序中创建、设计和修改用户界面元素的过程。这些界面对象不仅包括基本的控件如按钮、文本框和标签,还包括更复杂的......
  • django中分页器的使用方法(初、高级版本)
    效果图:方法如下:1.简单版(较繁琐但是直观):1.1定义数据库模型(models.py)中添加表classProductSample(models.Model):#示例商品表id=models.AutoField(db_column='ID',primary_key=True)#Fieldnamemadelowercase.item_id=models.CharField(verbose......
  • 创新性思维四方法及其应用案例
    在快速发展的现代社会中,创新性思维已成为个人和组织成功的关键因素。本文旨在探讨四种重要的创新性思维方法——逆向思维、六顶思考帽、头脑风暴和奔驰法(SCAMPER),并通过具体案例来展示这些方法在实际应用中的价值和效果。一、逆向思维逆向思维是一种打破常规、从相反或对立......
  • 解决过期苹果App应用的方法
     在使用苹果设备时,经常会遇到一些App应用已过期的情况,给用户带来不便。针对这一问题,本文将为您介绍几种处理过期苹果App应用的方法,包括更新应用、寻找替代应用、联系开发者和删除应用。通过这些方法,用户可以有效解决过期应用带来的问题。  1.更新应用首先,尝试更新该应用......
  • 描述我处理过的一个性能优化问题&如何实现Web应用的负载均衡?
    一、描述我处理过的一个性能优化问题在我过去的工作经历中,我遇到并成功解决了一个性能优化问题。这个问题发生在一个电商网站的后台管理系统中,当管理员尝试查询大量订单数据时,系统的响应速度非常慢,有时甚至导致页面超时或崩溃。为了解决这个问题,我首先进行了性能分析。通过查......