您现在的位置是:首页 > 正文

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

2024-04-01 00:29:58阅读 2

一、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点的定时任务了

网站文章

  • 蜂鸟E203开发环境准备工作

    蜂鸟E203开发环境准备工作

    蜂鸟E203开发环境准备工作WindowsWindows工具“NucleiStudio”的快速上手Windows工具“Eclipse”的快速上手Linux安装VMware,安装Ubuntu18.04u...

    2024-04-01 00:29:36
  • Android 共存debug release版, 并设置不同名字

    一部手机上同时安装app的debug版和release版,并显示不同名字 build.gradle buildTypes { debug { applicationIdSuffix ".debug" resValue "string", "app_name", "@string/app_name_debug" ...

    2024-04-01 00:29:28
  • 神经网络向量化实现

    神经网络向量化实现

    矢量化编程 当使用学习算法时,一段更快的代码通常意味着项目进展更快。例如,如果你的学习算法需要花费20分钟运行完成,这意味着你每个小时能“尝试”3个新主意。但是假如你的程序需要20个小时来运行,这意味着你一天只能“尝试”一个新主意,因为你需要花费这么长时间来等待程序的反馈。对于后者,假如你可以提升代码的效率让其只需要运行10个小时,那么你的效率差不多提升一倍。 矢量化编

    2024-04-01 00:29:21
  • 动态数据源切换 AbstractRoutingDataSource

    动态数据源切换 AbstractRoutingDataSource

    2024-04-01 00:28:57
  • 解决WebStorm中无法拉取自己项目的问题

    解决WebStorm中无法拉取自己项目的问题

    1.打开webstorm,然后点击(file->setting->github)2.输入自己的账号和密码这里如果电脑本地不是自己的账号,会报错解决方案:打开控制面板->用户账户->管理您的凭据,修改git用户名和密码3.配置你的git4.拉取git项目代码...

    2024-04-01 00:28:50
  • 山东师范大学2024年的计算机毕设题目大全50例

    最近要准备毕业设计了,不会选题,希望可以帮忙给一些毕业设计题目,我整整花了一周把之前做的答辩通过的毕业设计成品进行整理如下列表。

    2024-04-01 00:28:42
  • Windows10安装visual studio 2013

    https://wenku.baidu.com/view/6f1ba49955270722192ef7a8.html

    2024-04-01 00:28:37
  • LeetCode数据库题目汇总一(附答案)

    LeetCode数据库题目汇总一(附答案)

    表: `Queue````person_id 是这个表的主键。该表展示了所有等待电梯的人的信息。表中 person_id 和 turn 列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。``...

    2024-04-01 00:28:12
  • Java8新特性

    Java8新特性

    简单翻译如下:java特性:​ lambda表达式(Lambda Expressions)​ 方法引用(Method references)​ 默认方法(Default methods)​ 重复注释(...

    2024-04-01 00:28:06
  • python处理http接口请求(各类型数据「date/json」的请求/响应详细处理)

    python处理http接口请求(各类型数据「date/json」的请求/响应详细处理)

    python处理http接口请求(各类型数据「date/json」的请求/响应详细处理)

    2024-04-01 00:27:59