Django中celery的使用

一、celery的使用

celery架构图(核心):

在这里插入图片描述

1.1 使用场景及安装

使用celery,主要有以下几种情况
- 定时任务
- 延迟任务
- 异步任务

使用命令安装
pip install celery

官方使用django-celery的文档:
https://docs.celeryq.dev/en/main/django/first-steps-with-django.html#using-celery-with-django

1.2在项目路径下创建celery.py

import os
from celery import Celery

# 1 导入django的配置文件(可以在WSGI中找到)---》后续在celery的任务中,就可以直接使用django的orm,缓存
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TB_test.settings')
# 2 实例化得到celery对象
app = Celery('myproj')
# 3 celery的配置,使用django 配置文件中的配置--》刚刚写的配置
app.config_from_object('django.conf:settings')

# 4 这句话会去所有app中,自动查找 tasks.py 文件,作为任务文件
app.autodiscover_tasks()

在这里插入图片描述

1.3 django的配置文件settings.py

############# celery的配置信息######
#1 Broker配置,使用Redis作为消息中间件
BROKER_URL = 'redis://127.0.0.1:6379/1'
#2 BACKEND配置,使用redis
RESULT_BACKEND = 'redis://127.0.0.1:6379/2'
#3 序列化方案--》json
ACCEPT_CONTENT = ['json']
TASK_SERIALIZER = 'json'
# 结果序列化方案
RESULT_SERIALIZER = 'json'

# 4 任务结果过期时间,秒
TASK_RESULT_EXPIRES = 60 * 60 * 24

#5 时区配置
TIMEZONE = 'Asia/Shanghai'

在这里插入图片描述

1.4 在不同app中,创建tasks.py

from celery import shared_task

# 任务函数
@shared_task
def add(a, b):
    return a + b

在这里插入图片描述

1.5 在项目目录下的 init.py中进行配置

加入以下代码

from .celery import app as celery_app

__all__ = ('celery_app',)

在这里插入图片描述

二、异步任务

2.1 写一个视图函数测试

views.py中加入路由

urlpatterns = [
...
path('user/get_mobile/',celery_test.get_mobie,name='celery_test'),
...
]

###############视图函数中 views.py###############
from django.http import JsonResponse
from Light.tasks import add
from django.shortcuts import HttpResponse

def get_mobie(request):
    mobile = int(request.GET.get('mobile'))
    print(mobile)
    # 通过delay来调用异步方法,如果在tasks中,
    # add这个函数没有被shared_task修饰,那么这里就会报错
    res = add.delay(mobile, 5)
    return JsonResponse({'code': 200, 'msg': res.id})

2.2 启动worker

#celery -A 项目名 worker -l debug
celery -A TB_test worker -l debug

ps:好像在windows需要额外pip install eventlet

celery -A TB_test worker worker -l debug -P eventlet

2.3 启动浏览器,输入地址,查看结果

在这里插入图片描述

2.4 woker获取任务,执行

在这里插入图片描述

三、定时任务

3.1 django的配置文件配置

from datetime import timedelta
CELERYBEAT_SCHEDULE = {
    'every_5_second': {
        'task': 'Light.tasks.add',
        # 设置每隔5s执行一次add任务
        'schedule': timedelta(seconds=5),
        'args': (33, 44),
    }
}

在这里插入图片描述

3.2 重启woker,启动beat

celery执行定时任务的是beat,在开头的celery框架可以看出

# 启动一个worker
celery -A TB_test worker -l debug

# 启动定时任务
celery -A TB_test beat -l debug

在这里插入图片描述
beat就会按照配置时间5s把任务提交一次

四、通过Admin 后台管理添加定时任务

CELERYBEAT_SCHEDULE = {
    'every_5_second': {
        'task': 'Light.tasks.add',
        # 设置每隔5s执行一次add任务
        'schedule': timedelta(seconds=5),
        'args': (33, 44),
    }
}
# 现目前存在问题:
	如果要再新加一个定时任务(例如爬新闻数据)
    我们只能修改代码 :settings.py-->加入代码
    重启worker,重启beat--》才能行
    这样操作起来很麻烦
    
# 所以想要直接通过点点点,就能自动添加定时任务
	那么就可以引入 
	- Admin 后台管理添加定时任务

4.1 引入–安装djiango-celery-beat

pip install django-celery-beat

4.2 在app中注册djiango-celery-beat

INSTALLED_APPS = [
    ...
    'app01',
    'django_celery_beat' # 注册刚刚第三方模块

]

4.3 配置时区

# settings.py
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

# 配置调度器
# 只要配了这个,原来celery中的定时任务统一不能用了,需要我们手动配置了
CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' 

4.4 配置数据库,进行数据迁移

- 需要先安装mysql,用mysql创建一个数据库
- 再安装python中链接mysql需要用到的
- pip install mysqlclient
- pip install pymysql

################ settings.py ################
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Simpleuse',  # 数据库名字
        'USER': 'root',
        'PASSWORD': 'xxx',
        'HOST': '127.0.0.1',  # ip
        'PORT': 3306,
    }
}

################  app01/__init__.py ################
import pymysql
pymysql.install_as_MySQLdb()

在这里插入图片描述

命令行执行
python3 manage.py makemigrations
python3 manage.py migrate
#  django-celery-beat 这个app会产生表--》以后只要咱么在表里添加记录,就能制定定时任务

在这里插入图片描述
到此,数据库表就创建好了。

4.5 使用admin后台管理插入数据

4.5.1 创建账号

    -django提供了一个后台管理--》登录到后台管理,可以图形化界面录入数据
    -但是需要个账号登录:命令创建账号
    	python3 manage.py createsuperuser

在这里插入图片描述

4.5.2 打开网页,登录

在这里插入图片描述
在这里插入图片描述
界面略微丑陋,美化一下

4.6 美化admin界面

# 1  simpleui 美化admin
# 2 开源地址
https://gitee.com/tompeppa/simpleui
# 3 文档地址
https://newpanjing.github.io/simpleui_docs/config.html
    
# 4 安装
pip3 install django-simpleui

# 5 app中注册
INSTALLED_APPS = [
    'simpleui',
    ...
]

在这里插入图片描述

4.7 手动添加周期任务

# 1 启动worker,beat
# 启动worker
celery -A Simpleuse worker -l debug
# 启动beat
celery -A Simpleuse beat -l debug

在这里插入图片描述

五、通过Admin查看任务运行情况

# 在控制台监控任务执行情况或者去redis中查看,还不是很方便,最好是能够通过web界面看到任务的执行情况,如有多少任务在执行,有多少任务执行失败了等。

# 这个Celery也是可以做到了,就是将任务执行结果写到数据库中,通过web界面显示出来。

这里要用到django-celery-results插件。

通过插件可以使用Django的orm作为结果存储,这样的好处在于我们可以直接通过django的数据查看到任务状态,同时为可以制定更多的操作

5.1 安装django-celery-results

pip install django-celery-results

5.2 在app中注册

INSTALLED_APPS = (
...,
'django_celery_results',
)

5.3 修改配置文件

# 让之前backend----》结果存储放在redis中----》改到放到数据中---》因为在数据库中的咱们可以通过admin查看

#RESULT_BACKEND = 'redis://127.0.0.1:6379/1'

# 使用使用django orm 作为结果存储
CELERY_RESULT_BACKEND = 'django-db'  #使用django orm 作为结果存储

在这里插入图片描述

5.4 迁移数据库

# 执行迁移命令 
python3 manage.py makemigrations
python3 manage.py migrate

可以看到数据库多出了3张存储结果的表
在这里插入图片描述
在这里插入图片描述

六、通过flower插件监控任务情况

Flower 是一个用于监控和管理 Celery 集群的开源 Web 应用程序。它提供有关 Celery  workers 和tasks状态的实时信息

# Flower可以:
1 实时监控celery的Events
    -查看任务进度和历史记录
    -查看任务详细信息(参数、开始时间、运行时间等)

2 远程操作
    -查看workers 状态和统计数据
    -关闭并重新启动workers 实例
    -控制工作池大小和自动缩放设置
    -查看和修改工作实例消耗的队列
    -查看当前正在运行的任务
    -查看计划任务(预计到达时间/倒计时)
    -查看保留和撤销的任务
    -应用时间和速率限制
    -撤销或终止任务

3 Broker 监控
	-查看所有 Celery 队列的统计信息

6.1 安装flower和启动

#1  安装
pip install flower

# 2 启动
# celery -A 项目名 flower --port-指定端口号
# 项目名变了,这里下班了,在家换了一个电脑写,但是逻辑是一样的。
celery -A Simpleuse flower --port-5555

#3 浏览器访问:
http://127.0.0.1:5555/

获取更详细:http://127.0.0.1:5555/tasks
        
# 4 启动 worker,beat,flower
	-一般先启动flower

在这里插入图片描述

这个要比admin的看起来更友好一些

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Django-Celery是一个用于在Django应用集成Celery任务队列的插件。它允许你将耗时的任务异步执行,从而提高应用的性能和响应速度。下面是一些使用Django-Celery的步骤: 1. 安装CeleryDjango-Celery:首先,确保你已经安装了CeleryDjango-Celery。你可以通过运行以下命令来安装它们: ``` pip install celery django-celery ``` 2. 配置Celery:在Django项目的`settings.py`文件,添加以下配置: ```python # settings.py # 配置Celery Broker(消息代理) BROKER_URL = 'amqp://guest:guest@localhost:5672//' # 配置Celery Backend(结果存储) CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite' # 配置Celery Beat(定时任务) CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' ``` 请根据你的实际情况修改上述配置。 3. 创建Celery App:在你的Django项目,创建一个名为`celery.py`的文件,并添加以下代码: ```python # celery.py from celery import Celery app = Celery('your_project_name') # 配置Celery app.config_from_object('django.conf:settings', namespace='CELERY') # 自动从Django app加载任务 app.autodiscover_tasks() ``` 确保将`your_project_name`替换为你的项目名称。 4. 创建任务:在Django app创建一个任务。例如,你可以在你的app目录下创建一个名为`tasks.py`的文件,并添加以下代码: ```python # tasks.py from celery import shared_task @shared_task def add(x, y): return x + y ``` 这是一个简单的任务示例,将两个数字相加并返回结果。 5. 启动Celery Worker:运行以下命令来启动Celery worker: ``` celery -A your_project_name worker --loglevel=info ``` 确保将`your_project_name`替换为你的项目名称。 6. 调用任务:在你的Django应用程序,你可以通过导入任务函数并调用它来触发任务的执行。例如: ```python from your_app.tasks import add result = add.delay(1, 2) ``` 这里使用了`delay()`方法来异步调用任务。你也可以使用`apply_async()`方法来更精确地控制任务的执行。 这些是使用Django-Celery的基本步骤。你还可以配置更多高级选项,如任务重试、任务结果存储等。请参考Django-Celery的官方文档以获取更多详细信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值