Django中使用celery实现定时任务和异步任务

news2025/1/12 6:15:50

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、准备
  • 二、配置
    • 1.引入库
    • 2.代码编写
      • a、在settings.py文件下添加如下代码
      • b、在项目主目录下创建celery.py文件
      • c、在项目的__init__.py里面添加如下代码![在这里插入图片描述](https://img-blog.csdnimg.cn/dddaae97b4f0426cb089c3c1455ef3ce.png)
      • d、创建一个应用来调用异步任务,我这里创建名为app01的任务
      • e、在应用目录下面创建任务task.py
      • f、在app01下的views编写视图用于调用定时任务
      • g、运行
      • h、异步任务实验
  • 三、定时任务实现
    • 1、目标
    • 2、代码编写
      • a、在settings.py里面添加如下代码
      • b、在app01/tasks.py里面添加如下代码
      • c、运行
  • 问题总结


前言

之前做项目的时候需要使用celery,因此研究了一下用法,现在记录下来供以后参考。
django的任务都是同步的,如果遇到一些比较耗时的任务,就会一直卡在任务里面,无法进去其他的操作,影响用户体验。所以需要使用celery异步执行耗时操作,在不影响用户操作的同时还能完成比较耗时的任务

在编写代码过程中遇到的一些错误会在文章末尾总结,遇到问题可以先参考一下。


一、准备

python:3.7
django:3.2.19
celery:5.2.7
redis:4.5.5

电脑上需要安装redis数据库
创建一个能运行的django项目

二、配置

我的项目目录结构如下
在这里插入图片描述

1.引入库

安装celery和redis

pip install celery
pip install redis

2.代码编写

a、在settings.py文件下添加如下代码

# Broker配置,使用Redis作为消息中间件
BROKER_URL = 'redis://127.0.0.1:6379/0'

# BACKEND配置,这里使用redis
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'

# 结果序列化方案
CELERY_RESULT_SERIALIZER = 'json'

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

# 时区配置
CELERY_TIMEZONE = 'Asia/Shanghai'

# 指定导入的任务模块,可以指定多个
CELERY_IMPORTS = (
   'app01.tasks',
)

b、在项目主目录下创建celery.py文件

from __future__ import absolute_import, unicode_literals
import os
import django
from celery import Celery
from django.conf import settings


# 设置系统环境变量,安装django,必须设置,否则在启动celery时会报错
# django_celery_demo 是当前项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery_demo.settings')
django.setup()

celery_app = Celery('django_celery_demo')
celery_app.config_from_object('django.conf:settings')
celery_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

c、在项目的__init__.py里面添加如下代码在这里插入图片描述

from __future__ import absolute_import, unicode_literals
from .celery import celery_app

__all__ = ['celery_app']

d、创建一个应用来调用异步任务,我这里创建名为app01的任务

python manage.py startapp app01

e、在应用目录下面创建任务task.py

在这里插入图片描述
task.py

from time import sleep
from celery import shared_task


@shared_task
def async_task(x, y):
    sleep(10)    # 睡眠10秒,这里模拟耗时操作
    print(x + y)

f、在app01下的views编写视图用于调用定时任务

在这里插入图片描述
views.py

from django.shortcuts import HttpResponse
from .tasks import async_task


# Create your views here.
def task_add_view(request):
    async_task.delay(100, 200)
    return HttpResponse("函数调用结果")

urls.py

from django.urls import path
from .views import task_add_view

urlpatterns = [
    path('async_task/', task_add_view),
]

g、运行

运行定时任务,需要依赖eventlet,先下载eventlet

pip install eventlet

然后,启动redis服务器
在这里插入图片描述
输入下面命令启动异步任务,注意:django_celery_demo是项目名,请根据实际项目名输入

celery -A django_celery_demo worker -l debug -P eventlet

看到下面结果就说明能成功执行:
在这里插入图片描述

h、异步任务实验

运行django项目
在这里插入图片描述
这里我访问了三次该链接:
在这里插入图片描述
可以看到命令窗口中输出三次执行结果,每次执行结果10秒左右,说明任务运行成功,也没有阻塞主线程的执行。由于这里没有返回值,所以返回值为None(在秒数后面展示)
在这里插入图片描述

三、定时任务实现

定时任务也和简单,在前面的代码基础上添加代码即可

1、目标

每隔10秒往scheduled_task.txt中写入一段记录

2、代码编写

a、在settings.py里面添加如下代码

# 定时任务
CELERYBEAT_SCHEDULE = {
    'mul_every_10_seconds': {
        # 任务路径
        'task': 'app01.tasks.scheduled_task',
        # 每10s执行一次
        'schedule': timedelta(seconds=10),
    }
}

b、在app01/tasks.py里面添加如下代码

@shared_task(bind=True)
def scheduled_task(self):
    with open("scheduled_task.txt", "a", encoding="utf-8") as f:
        time_str = time.strftime("%Y年%m月%d日 %H时%M分%S秒", time.localtime())
        data = "记录一条消息,时间:" + time_str + '\n'
        f.write(data)
        f.close()
        print(time_str)

c、运行

先运行下面命令(就是上面执行异步任务的命令,如果上面运行之后没关闭的话直接进行下一步)

celery -A django_celery_demo worker -l debug -P eventlet

然后新开一个命令行窗口输入如下命令:

celery -A django_celery_demo beat -l debug

看到下面结果说明运行成功:
在这里插入图片描述
然后项目根路径会生成一个scheduled_task.txt文件,打开可以看到下面内容:
在这里插入图片描述
确实是每隔10秒执行一次。

问题总结

一、报错:ImportError: cannot import name ‘Celery’ from ‘celery’
解决:解决:将importlib-metadata包的版本降至4.13.0


二、报错:ImportError: cannot import name ‘current_app’ from ‘celery’
解决:安装django-celery-beat和django-celery-results包,我用的都是2.5.0版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/602025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【期望】Kuangbin 危险的派对 牛客期望专题班 increment of coins

4849. 危险的迷宫 - AcWing题库 题意: 思路: 本来对期望怎么想都想不通,后来看了大佬的题解,自己动手画了画,以及队友说的“拆分”,忽然间就有点懂了.... 这个说的很对,把期望问题看作是DAG上…

Unity中对预制体烘焙光照贴图,在其他Scene中使用或者动态生成带光照贴图的预制体

记录个人开发笔记,如果有大佬有更好的方法或者觉得我这个方法哪里有问题欢迎指正! 首先说下为什么会弄预制体烘焙光照贴图,因为项目需求需要动态生成一个房间的,因此是将房间弄成预制体,动态生成就好了,这…

【Datagear】如何给Datagear追加Admin

【背景】 Datagear默认是只设置了一个Admin,这个Admin可以完成用户的各种管理操作,并且对所有数据源,数据集,图表,面板拥有全部编辑权限。 【问题】 只有一个Admin很多场景下不够用。但是应用设置本身没有提供追加A…

【测试人生】测试工程如何去学习接口自动化技术

一、为什么要学习自动化 提高生产力:自动化可以帮助您在短时间内完成重复性工作,从而大大提高生产力。自动化不仅减少了手动执行任务所需的时间和精力,还减少了出错的风险。 质量保证:自动化测试可以确保软件在修改后仍然按预期运…

2023 光亚展|乐鑫将携 AI、Wi-Fi 6、私有云和 Matter 方案精彩亮相

2023 广州国际照明展览会(光亚展)将于 6 月 9 至 12 日在广州琶洲展馆启幕。本届展会以“光未来”为主题,畅想未来生活方式的无限可能。乐鑫科技 (688018.SH) 将在 B 区 9.2 号厅 D55 展位,带来具有前瞻性的智能照明解决方案和实体…

龙芯2K1000实战开发-以太网/串口设计

文章目录 概要整体架构流程技术名词解释技术细节小结概要 本文主要针对2k1000的以太网及串口的国产化设计 整体架构流程 提示:这里可以添加技术整体架构 整体架构,以太网,使用2k1000自带的以太网mac控制器,外选用国产化PHY,国产化变压器。 整体框架,如下图,主要是器…

2023安卓逆向 -- JNI学习(从开发到反编译)

一、新建native C项目,填写好项目信息,一路下一步即可 二、创建好项目,直接点击运行,出现下面界面,说明我们的环境都没有问题 三、Java层调用java层函数 1、新建一个Java Class,命名为JavaFun 2、编写java…

维宏系统修改端口位置操作说明

1.关闭软件后找到Ncconfig.exe工具并打开 具体操作步骤 (1)桌面上鼠标点到 NcStudio鼠标右键-打开文件所在的位置如下图 (2) 在目录中找到NcConfig.exe的快捷方式(黄色图标) (3)打开并输入密码(密码和软件密码一样默认初始密码ncstudio …

欧科云链:2023年5月链上安全事件盘点

一、基本信息 2023年5月安全事件约造成1800万美元损失,相比上月有显著下降,但安全事件发生频率并未减少。其中针对Jimbos Protocol的攻击造成了约750万美元损失。Arbitrum链的Swaprum项目Rug Pull造成了约300万美元的损失。此外,社交媒体钓鱼…

工业RFID解决方案怎么选?主要看这几项内容

如何选择适合您需求的RFID解决方案?通过深入了解需求、环境适应性、成本效益和供应商选择,您将能够更加全面地评估和选择适合自身需求的RFID解决方案。同时,不断与供应商和专业人员进行沟通和合作,可以获取更多关于特定解决方案的…

FineReport自定义排序

FineReport是帆软的报表开发工具,报表开发者可以用低代码的形式,配置出报表。主要适用于较简单的填报场景(比如填写销售目标,维护项目映射关系等),用户可以在报表上填报数据,存储于数据库&#…

【TES605】基于Virtex-7 FPGA的高性能实时信号处理板

板卡概述 TES605是一款基于Virtex-7 FPGA的高性能实时信号处理平台,该平台采用1片TI的KeyStone系列多核DSP TMS320C6678作为主处理单元,采用1片Xilinx的Virtex-7系列FPGA XC7VX690T作为协处理单元,具有2个FMC子卡接口,各个处理节点…

PIC 使能485/422_Part2.2_激活485半双工(修订中...)

1.485底层协议辨识 黄色是PIC发出的,打头的字符是"\r\n\r\n"。绿色的是上位机485接口设备发送字符串“App1"的波形。波特率均为115200。上位机绿色的波形自发自收没有问题。 示波器设置为下降沿触发——485平时空闲状态,线路维持高电平&…

linux0.12-12-1-总体功能

[606页] 12-1 总体功能 本章所注释的程序量较大,但是通过第5章中对Linux源代码目录结构的分析(参见图5-27), 可以把它们从功能上分为4个部分进行讨论。 第一部分是有关高速缓冲区的管理程序,主要实现了对硬盘等块设备…

隔离驱动芯片SLMi332兼容光耦隔离驱动器时的注意事项

数明深力科SLMi33x系列SLMi332是一款兼容光耦带DESAT保护功能的IGBT/SiC隔离驱动器。内置快速去饱和(DESAT) 故障检测功能、米勒钳位功能、漏极开路故障反馈、软关断功能以及可选择的自恢复模式,兼容光耦隔离驱动器。 SLMi33x系列SLMi332的DESAT阈值为6.5V&#xf…

Hive学习---4、函数

1、函数 1.1 函数简介 Hive会将常用的逻辑封装成函数给用户进行使用,类似java中的函数。 好处:避免用户反复写逻辑,可以直接拿来使用 重点:用户需要知道函数叫什么,能做什么 Hive提供了大量的内置函数,按…

ATTCK v13版本战术介绍——凭证访问(一)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权、防御规避战术,本期我们为大家介绍ATT&CK 14项战术中凭证访问战术第1-6种子技术,后续会介绍凭证访问其他子技术,敬请关注。 二、ATT&C…

深度学习目标检测项目实战(六)-基于Faster rcnn pytorch的遥感图像检测

基于Faster rcnn pytorch的遥感图像检测 代码:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 数据集 使用RSOD遥感数据集,VOC的数据格式如下: RSOD是一个开放的目标检测数据集,用于遥感图像中的目标检测。…

01_pytorch中的DataSet

在pytorch 中, Dataset: 用于数据集的创建; DataLoader: 用于在训练过程中,传递获取一个batch的数据; 这里先介绍 pytorch 中的 Dataset 这个类, torch.utils.data. dataset.py 是一个表示数据集的抽象类。任何自定义…

SharpContour论文精读

SharpContour: A Contour-based Boundary Refinement Approach for Efficient and Accurate Instance Segmentation 论文链接:[2203.13312] SharpContour: A Contour-based Boundary Refinement Approach for Efficient and Accurate Instance Segmentation (arxiv…