celery 系列:celery使用示例(5)

1、说明

  1. 版本: `celery==5.27
  2. 基于在django中

2、流程

  1. 配置celery
  2. 创建 celery应用对象
  3. 定义celery任务
  4. 调用celery任务

3、目录结构(按需设置)

Myproject/
|-- project/
|   |-- __init__.py
|   |-- settings.py
|-- celery_tasks/
|   |-- __init__.py
|   |-- celery.py
|   |-- config.py
|   |-- tasks.py
|-- ...
  • celery.pycelery应用
  • config.pycelery配置项,也可以放到settings中配置。
  • tasks.py:任务文件

4、配置celery

celery.py

CELERY_BROKER_URL = 'amqp://guest@localhost//'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'
  • CELERY_BROKER_URL:消息代理,消息队列的地址。amqp协议,即rabbitmq,本地guest用户。
  • CELERY_RESULT_BACKEND:任务结果存储后端,本地redis
  • CELERY_ACCEPT_CONTENT:celery可以接收的数据类型
  • CELERY_TASK_SERIALIZER:任务序列化
  • CELERY_RESULT_SERIALIZER:结果序列化
  • CELERY_TIMEZONE

ps:我用的rabbitmq作为消息代理,为了方便,你可以用redis

  • CELERY_BROKER_URL = 'redis://localhost:6379/0'

5、创建 celery应用

celery.py

from celery import Celery
from django.conf import settings

import os
import sys
import django

# 将项目根目录添加到 Python 的模块搜索路径中  
back = os.path.dirname
BASE_DIR = back(back(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)


# 设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogproject.settings.production')


# 实例化Celery
app = Celery('celery_tasks')

# 配置celery
app.config_from_object("celery_tasks.config")

# Celery加载任务
app.autodiscover_tasks(['celery_tasks'])

# 可以从INSTALLED_APPS加载任务。
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
  1. 由于celery是独立的项目,所以必须导入django环境
  2. app = Celery('celery_tasks') 创建了一个名为 'celery_tasks' 的 Celery 应用程序实例,它是与 Celery 相关的任务处理的核心对象。这个实例将被用于管理和执行与 celery 相关的任务。通过这个实例,您可以配置和管理各种 Celery 的功能,比如任务队列、调度器、任务结果等。
  3. 加载配置:指定从celery_tasks下的config文件中配置。
  4. Celery加载任务:指定在celery_tasks下发现任务。

6、定义celery任务

tasks.py:

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

@shared_task
def add(x, y):
    print(x + y)
  1. 用装饰器shared_task将一个普通函数装饰器celery任务

7、调用celery任务

在需要的地方,使用 add.delay() 将任务加入任务队列。

8、在settings中配置celery

说明:截止到第7小节,celery一个完整的使用已结束。这里说一下配置项配置在settings.py该怎么办。定义和调用任务都是一样的,配置项也是一样的,无非移到了django配置文件中。主要差别在于创建celery应用时。

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

9、自动发现任务

发现任务除了可以指定路径外,还可以从INSTALLED_APPS加载任务。将celery_tasks注册为app,然后发现任务更改为:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

Celery 会自动搜索您项目中的每个 Django 应用,查找名为 tasks.py 的模块,然后加载其中定义的 Celery 任务。

当然,方式不是死的,可以按照自己的需求或者意愿来组合


发表评论

评论列表,共 0 条评论

    暂无评论