django中使用celery做异步任务、定时任务

一、celery架构图

  • 生产者消费者模型
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TE6POByU-1626750158616)(https://note.youdao.com/yws/res/16680/WEBRESOURCEe422d455a850077297addf008a072506)]

  • 调度方法
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XDaemI3G-1626750158619)(https://note.youdao.com/yws/res/5/WEBRESOURCEaf9d4048977674a2b1396b60f2e13ac5)]

二、配置使用

celery很容易集成到Django框架中,当然如果想要实现定时任务的话还需要安装django-celery-beta插件,后面会说明。需要注意的是Celery4.0只支持Django版本>=1.8的,如果是小于1.8版本需要使用Celery3.1。

配置

创建新项目tasktest,目录结构(每个app下多个tasks文件,用于定义任务)

tasktest
├── app01
│   ├── __init__.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tasks.py
│   └── views.py
├── manage.py
├── taskproj
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── templates

在项目目录 tasktest/tasktest/ 目录下创建 celery.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author:wd
# from __future__ import absolute_import, unicode_literals
import os
from celery import Celery


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tasktest.settings')  # 设置django环境

app = Celery('tasktest')

app.config_from_object('django.conf:settings', namespace='CELERY')  # 使用CELERY_ 作为前缀,在settings中写配置

app.autodiscover_tasks()  # 发现任务文件每个app下的task.py


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

tasktest/tasktest/init.py

from __future__ import absolute_import, unicode_literals
from tasktest.celery import app as celery_app

__all__ = ('celery_app', )

tasktest/tasktest/settings.py

CELERY_BROKER_URL = "redis://127.0.0.1:6379/1"
RESULT_BACKEND = "redis://127.0.0.1:6379/1"
BROKER_TRANSPORT = 'redis'
CELERY_RESULT_SERIALIZER = 'json'  # 结果序列化方案

在项目目录下启动worker

  • windows下

      celery -A demo2 worker -l info -P eventlet    # 需要下载 pip install eventlet
    
  • linux下

      celery -A demo worker -l info
    
定义与触发任务

定义任务在每个tasks文件中,app01/tasks.py

from __future__ import absolute_import, unicode_literals
from celery import shared_task

# 这里不使用@app.task,而是用@shared_task,是指定可以在其他APP中也可以调用这个任务
@shared_task
def add(x, y):
    return x + y


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

视图中触发任务

from django.http import JsonResponse
from app01 import tasks

# Create your views here.

def index(request,*args,**kwargs):
    res=tasks.add.delay(1,3)
    #任务逻辑
    return JsonResponse({'status':'successful','task_id':res.task_id})

二、celery 定时任务

如果想要在django中使用定时任务功能同样是靠beat完成任务发送功能,当在Django中使用定时任务时,需要安装django-celery-beat插件。以下将介绍使用过程。

安装配置

1.beat插件安装

pip install django-celery-beat

2.注册APP

INSTALLED_APPS = [
   ....   
   'django_celery_beat',
]

3.数据库变更

python manage.py migrate django_celery_beat

4.在 tasktest/settings 中追加配置

if USE_TZ:
  	CELERY_TIMEZONE = TIME_ZONE # 设置时区

# 使用django_celery_beat插件用来动态配置任务!
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'

5.分别启动woker和beat

celery -A tasktest beat -l info     # 启动celery-beat
celery -A tasktest worker -l info   # 启动worker

6.创建用户

python manage.py createsuperuser

7.登录admin进行管理(地址http://127.0.0.1:8000/admin)
在这里插入图片描述

实战1 定时任务每天的早上5点执行 app1/add 任务

在这里插入图片描述
添加一个计划任务 配置每天早上5点的计划
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ng1CIyQu-1626750158627)(https://note.youdao.com/yws/res/f/WEBRESOURCE2b107a06b1a13892213ad657588751ef)]
再返回首页点击任务定义,新建一个任务
在这里插入图片描述
创建时要注意
在这里插入图片描述
保存后启动 celery-beat 和 worker 就实现一个每天早上5点的定时任务了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Celery是一个Python分布式任务队列,它可以帮助我们异步地执行任务,而且还可以定时执行任务。下面是使用DjangoCelery框架来实现定时任务的执行的步骤: 1. 安装Celery。可以使用pip工具来安装Celery。 ```bash pip install celery ``` 2. 配置Django项目。在Django项目的settings.py文件加入以下配置: ```python INSTALLED_APPS = [ # ... 'django_celery_results', 'django_celery_beat', # ... ] CELERY_BROKER_URL = 'redis://localhost:6379' CELERY_RESULT_BACKEND = 'django-db' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_RESULT_SERIALIZER = 'json' CELERY_TASK_SERIALIZER = 'json' ``` 其CELERY_BROKER_URL是指定Celery使用Redis作为消息代理,CELERY_RESULT_BACKEND是指定Celery的结果存储方式为Django数据库,CELERY_ACCEPT_CONTENT、CELERY_RESULT_SERIALIZER和CELERY_TASK_SERIALIZER则是指定消息的序列化方式。 3. 创建定时任务。在Django项目的tasks.py文件定义需要定时执行的任务。例如: ```python from celery import shared_task @shared_task def hello(): print('Hello, World!') ``` 4. 配置定时任务。在Django项目的settings.py文件加入以下配置: ```python CELERY_BEAT_SCHEDULE = { 'hello_task': { 'task': 'tasks.hello', 'schedule': 10.0, }, } ``` 其,'hello_task'是任务的名称,'task'指定了任务的函数名,'schedule'则指定了任务的执行间隔时间。 5. 启动Celery。在Django项目的根目录下执行以下命令启动Celery: ```bash celery -A your_project_name worker -l info -B ``` 其,-A参数指定了Celery要加载的Django项目的名称,-B参数表示启用定时任务。 6. 测试定时任务是否生效。等待10秒钟后,可以在控制台看到输出了'Hello, World!',表示定时任务已经成功执行。 以上就是使用DjangoCelery框架来实现定时任务的执行的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值