• Celery笔记四之在Django中使用celery


    这一篇笔记介绍一下如何在 Django 系统中使用 celery

    如果是想纯粹使用 celery,这一篇笔记可以略过。

    本篇笔记目录如下:

    1. 文件配置
    2. task 定义
    3. 运行 worker

    1、文件配置

    我们这里使用前面的创建的 hunter Django 系统。

    我们需要在 settings.py 所在的文件夹下配置如下几个文件:

    hunter/hunter/
            /__init__.py
            /celery.py
            /settings.py
    
    • 1
    • 2
    • 3
    • 4

    其中,celery.py 文件是我们需要新建的,其他的两个我们需要新增一点配置项。

    以下是 celery.py 文件内容:

    # hunter/hunter/celery.py
    import os
    from celery import Celery
    
    # 为 celery 程序设置默认的 Django 配置
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hunter.settings')
    
    app = Celery('hunter')
    
    # 表示从 Django 的配置中加载 celery 的配置,namespace='CELERY' 表示 celery 的配置必须是以 'CELERY' 为前缀
    app.config_from_object('django.conf:settings', namespace='CELERY')
    
    app.conf.update(
        task_ignore_result=True
    )
    
    # 我们需要设置的定时任务 或者 延时任务都可以在对应的 application 下定义,task 的定义我们在下面介绍
    # 然后通过下面的命令自动发现对应的任务
    # 比如想要在 blog 下设置一个延时任务,可以创建 blog/tasks.py,然后 celery 就可以自己发现对应的任务
    app.autodiscover_tasks()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在 Django 的 celery.py 里,不一样的是,os.environ.setdefault() 函数设置了一个 Django 的配置

    对 Celery() 实例化的时候,用到的是 Django 的系统名称 hunter

    而这里使用到的 config_from_object() 用到的值是 ‘django.conf:settings’,namespace 的值是 ‘CELERY’,表示在 settings.py 中所有 CELERY 开头的值都可以被捕捉到并作为 celery 的配置项,这个我们等下介绍。

    最后面有一个 app.autodiscover_tasks() 表示Django 系统将会自动获取 Django 系统下各个 application 的 tasks.py 的 task。

    以上就是一个最基本的使用模板。

    settings.py

    在 settings.py 中的配置如下:

    CELERY_ENABLE_UTC = False
    CELERY_TIMEZONE = "Asia/Shanghai"
    CELERY_BROKER_URL = "redis://localhost/0"
    CELERY_RESULT_BACKEND = "redis://localhost/1"
    
    • 1
    • 2
    • 3
    • 4

    其中,所有的关于 celery 的配置都需要加上 CELERY_ 的前缀,参数值的定义和之前 celeryconfig.py 中的定义方式是一致的。

    还有很多其他的配置项对应值,详见下面的链接:celery配置项

    除此之外,为了确保 celery 的 app 在 Django 运行的时候被加载,我们还需要在 hunter/hunter/init.py 中引入 celery_app。

    # hunter/hunter/__init__.py
    from .celery import app as celery_app
    
    __all__ = ('celery_app',)
    
    • 1
    • 2
    • 3
    • 4

    这样,每个 application 下的 tasks.py 中被 @shared_task 修饰的延时或定时任务就可以使用了。

    2、task 定义

    假设我们还是沿用之前的 application,命名为 blog,我们在这个文件夹下创建一个 tasks.py,内容如下:

    # blog/tasks.py
    from celery import shared_task
    
    @shared_task
    def test_add(x, y):
        return x + y
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在 Django 的 tasks 里我们会把 task 都写在可重复使用的 app 下,比如 blog,但是这些 app 不能依赖于项目本身,所以不能直接引入这些app实例

    @shared_task 装饰器可以让你在不需要任何具体的 app 实例的情况下创建 task

    以上是官方文档给出的一段介绍,u1s1,我不太理解这段话的含义,但是我们照做就行了,就是在 Django 的 task 中,我们使用 @shared_task 来修饰那些 task 即可。

    就此,我们将 celery 融入 Django 的操作就完成啦!

    3、运行 worker

    我们还是需要单独将 worker 运行起来才可以调用延时任务

    我们在 Django 系统的根目录下,也就是 hunter/ 下,执行:

    celery -A hunter worker -l INFO
    
    • 1

    然后新开一个 shell,在 Django 系统的根目录下进入 Django 的 shell,也就是使用 python3 manage.py shell,然后调用 task:

    from blog.tasks import test_add
    
    test_add.delay(1, 2)
    
    • 1
    • 2
    • 3

    关于 celery 与 Django 的融合,还有一些其他操作,比如将 task 运行的 result 写入 Django 的表,使用 Django 的表来设置定义任务等,这个我们后面再单开笔记来详细介绍。

    本文首发于本人微信公众号,可搜索关注:Hunter后端

  • 相关阅读:
    Linux中ls和find命令后接的通配符字符串要不要加双引号?
    WebGIS 地铁交通线网数据可视化监控平台
    如何像开发人员一样思考_成为一个问题解决者
    【Java进阶面试系列之一】哥们,你们的系统架构中为什么要引入消息中间件?
    centos7 Kafka安装
    uboot源码分析(基于S5PV210)之uboot的命令体系与环境变量
    bootz启动 Linux内核过程中涉及的全局变量images
    Ubuntu 环境配置 Minecraft 基岩版服务器
    设计模式六大原则
    长尾词-长尾词软件-长尾词挖掘工具免费
  • 原文地址:https://blog.csdn.net/weixin_43354181/article/details/126753731