当前位置: 首页 > news >正文

Django结合Celery进行异步调用

目录

Celery介绍

相关环境

相关配置

1、在proj/proj/目录下创建一个新的celery.py模块

定义 Celery 实例:

2、在proj/proj/__init__.py 模块中导入这个应用程序。

3、在各自模块中定义任务文件tasks.py

4、settings.py配置

 服务启动

 异步调用

 


Celery介绍

Celery 是一个简单,灵活且可靠的分布式系统,可以处理大量消息。它是一个任务队列,着重于实时处理,同时还支持任务调度。

Celery 可以做队列、异步调用、解耦、高并发、流量削峰、定时任务等等

一个 Celery 系统可以由多个 worker 和 broker 组成,从而实现高可用性和横向扩展。

Celery既可以独立使用,也可以结合Django使用

原理:celery将待处理任务扔进消息队列,然后由worker进程进行消费

相关环境

Python 3.8
django-celery-beat==2.5.0
django-celery-results==2.5.1
celery==5.2.7
redis==4.6.0

此文中用redis做消息队列,用Mysql5.7保存执行结果

相关配置

 Django 项目布局如下:

- proj/- manage.py- proj/- __init__.py- settings.py- urls.py

1、在proj/proj/目录下创建一个新的celery.py模块

定义 Celery 实例:

import osfrom celery import Celery# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')app = Celery('proj')# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')# Load task modules from all registered Django apps.
app.autodiscover_tasks()@app.task(bind=True, ignore_result=True)
def debug_task(self):print(f'Request: {self.request!r}')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') 将设置模块传递给设置模块传递给celery程序
app.config_from_object('django.conf:settings', namespace='CELERY')从配置文件中获取以CELERY开头的配置

2、在proj/proj/__init__.py 模块中导入这个应用程序。

主要是为了应用程序在 Django 启动时加载,以便@shared_task装饰器:

proj/proj/__init__.py

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app__all__ = ('celery_app',)

3、在各自模块中定义任务文件tasks.py

Celery 会自动从tasks.py发现这些任务

#一个简单的tasks任务from celery import shared_task@shared_task
def add(x, y):return x + y

目录结构如下

- proj/- manage.py- proj1/- tasks.py- admin.py- models.py- views.py- tests.py- apps.py- proj/- __init__.py- settings.py- celery.py- urls.py

4、settings.py配置

CELERY_BROKER_URL= xxxx.xxx.xxx.xxx
# 消息队列地址,可以是redis、mq、mysql等等
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = "Asia/Shanghai"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60
CELERY_ENABLE_UTC = False
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
CELERY_RESULT_BACKEND = 'django-db'
# 任务执行结果保存方式
CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS= {'global_keyprefix': '{}_celery_prefix_'.format(ENV_PROFILE)
}
CELERYD_CONCURRENCY = 5
# 执行任务的并发工作进程/线程/线程的数量。
CELERYD_MAX_TASKS_PER_CHILD = 100
# 任务池工作进程在被新进程替换之前可以执行的最大任务数。默认没有限制。
CELERYD_FORCE_EXECV = True

CELERY_TASK_TRACK_STARTED:当True时,任务判断是否将其状态报告为“已启动”。默认值是False。任何长时间运行任务并且需要报告当前正在运行的任务。

CELERY_TASK_TIME_LIMIT:任务时间限制(以秒为单位)。当超过这个值时,处理任务进程将被杀死并被新的进程取代。

CELERY_ACCEPT_CONTENT:收到的消息进行序列化,默认情况下仅启用 json,但可以添加任何内容类型,包括 pickle 和 yaml;

注意

1、celery从4.0引入了小写配置,但是从 Django 设置模块加载 Celery 配置,需要继续使用大写名称。而且还需要使用CELERY_前缀,以便 Celery 设置不会与其他应用程序使用的 Django 设置发生冲突。

2、用Mysql5.7作为任务结果存储,数据库设置为utf8,如果使用utf8mb4无法成功创建相关表

 服务启动

celery -A proj worker -l INFO
#定时任务启动方式如下:
celery -A itmanager beat 

异步调用

views.py代码如下

#一个简单的tasks任务from proj1.tasks import adddef add(request):x = int(request.POST.get('x', '0'))y = int(request.POST.get('y', '0'))addInfo.delay(x, y)

默认情况下不启用保存结果。本文我们已经Celery 结果后端。在admin管理后台可以看到任务运行情况

常见问题

1、结果未保存或任务始终处于PENDING状态

所有任务默认为PENDING,因此状态为“未知”。发送任务时,Celery 不会更新状态,并且任何没有历史记录的任务都被假定为待处理。

  1. 确保该任务ignore_result未启用。

    启用此选项将强制工作人员跳过更新状态

  2. 确保没有任何旧线程在运行。

    很容易意外启动多个工作线程,因此在启动新工作线程之前,请确保前一个工作线程已正确关闭。

    未配置预期结果后端的旧工作人员可能正在运行并劫持任务。

    可以将该参数--pidfile设置为绝对路径以确保不会发生这种情况。

  3. 确保客户端配置了正确的后端。

    如果由于某种原因,客户端配置为使用与工作线程不同的后端,您将无法收到结果。确保后端配置正确:

    >>> result = task.delay()
    >>> print(result.backend)

相关文章:

Django结合Celery进行异步调用

目录 Celery介绍 相关环境 相关配置 1、在proj/proj/目录下创建一个新的celery.py模块 定义 Celery 实例: 2、在proj/proj/__init__.py 模块中导入这个应用程序。 3、在各自模块中定义任务文件tasks.py 4、settings.py配置 服务启动 异步调用 Celery介绍 C…...

职场经验|项目管理发展方向有哪些?

很多人都知道项目管理行业发展前景比较好,但都不知道从哪下手?今天胖圆给大家分享一下,想要从事项目管理行业,有哪几种职业方向~ 1. 项目经理(Project Manager):负责项目的规划、执行和控制&am…...

Linux的shell(极其粗糙版)

Shell脚本: 脚本主要是为了业务,辅助人工,实现自动化运维 Shell:介于用户和内核之间,充当翻译官的作用,当用户执行相关的命令,shell会把指令二进制传给内核,内核处理完毕以后通过shell把内核的…...

没有英语要求的中国人大女王金融硕士有多香你可能还不知道

在当今全球化的世界中,英语已经成为了一种国际通用语言。对于许多学生来说,掌握英语是实现个人发展和职业成功的关键。尤其是在读研阶段,英语水平的要求更是不容忽视。但现实问题是我们没有相应的语言环境,直接导致的是大学的英语…...

低代码平台如何实现快速开发应用?

目录 一、低代码“快”在哪里? 下面分享低代码低代码平台实现快速开发的一些主要方式: 1.图形化编程: 2.预构建组件: 3.模板和插件: 4.自动化流程: 5.集成和扩展: 6.多端适配: 7.快速…...

iOS原生、Android 原生, flutter 三种方式给照片流添加文字(水印)

效果图:三中代码实现的效果差不多 Swift:代码 import UIKitclass ImageWatermarking: NSObject {static func textToImage(drawText text: String, inImage initImage: UIImage, atPoint point: CGPoint) -> UIImage {let textColor = UIColor.whitelet textFont = UIFon…...

数据结构: 红黑树

目录 1.红黑树概念 2.红黑树性质 3.调整 1.如果p和u都是红色,将其都改为黑色即可,然后向上调整 2.如果p红(u黑/u不在),这时候左子树两红,于是给右子树一个红(旋转变色) 2.1右单旋 变色- …...

如何搭建开源ERP平台Odoo并实现公网远程访问?——“cpolar内网穿透”

文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…...

什么是马尔科夫随机场?

马尔科夫随机场,也称为马尔可夫网(Markov Network),是一种概率图模型,用于表示随机变量之间的依赖关系。它是由若干个随机变量组成的无向图,其中节点代表随机变量,边代表它们之间的相互作用或依…...

自然语言处理---huggingface平台使用指南

1 huggingface介绍 Huggingface总部位于纽约,是一家专注于自然语言处理、人工智能和分布式系统的创业公司。他们所提供的聊天机器人技术一直颇受欢迎,但更出名的是他们在NLP开源社区上的贡献。Huggingface一直致力于自然语言处理NLP技术的平民化(democr…...

修炼k8s+flink+hdfs+dlink(六:学习k8s-pod)

一:增(创建)。 直接进行创建。 kubectl run nginx --imagenginx使用yaml清单方式进行创建。 直接创建方式,并建立pod。 kubectl create deployment my-nginx-deployment --imagenginx:latest 先创建employment,不…...

ARM映像文件组成

引言 ARM编译器将各种源文件(汇编文件、C语言程序文件、C语言程序文件)编译生成ELF格式的目标文件(后缀为.o文件,以下将目标文件简称为.o文件),.o文件经过连接器,和C/C运行时库一起编译生成ELF格…...

redis怎么设计一个高性能hash表

问题 redis 怎么解决的hash冲突问题 ?redis 对于扩容rehash有什么优秀的设计? hash 目标是解决hash冲突,那什么是hash冲突呢? 实际上,一个最简单的 Hash 表就是一个数组,数组里的每个元素是一个哈希桶&…...

《软件方法》强化自测题-总纲(6)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 按照业务建模、需求、分析、设计工作流考察,答案不直接给出,可访问自测链接或扫二维码自测,做到全对才能知道答案。 知识点见《软件方法》&#x…...

vue2中,下拉框多选和全选的实现

vue2中&#xff0c;下拉框多选和全选的实现 代码布局在methods: 中添加功能函数较为完整的一个整体代码&#xff1a; 如图所示点击全选即可完成下拉框中全部子项的全部的选中&#xff0c;同时取消全选即可全部取消选择。 代码布局 <div class"chos-box2"><…...

Android-Framework 默认音乐音量最大

代码位置&#xff1a;frameworks/base/services/core/java/com/android/server/audio/AudioService.java -712,6 712,9 public class AudioService extends IAudioService.Stub}} // force music max volume AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] MA…...

formData对象打印不出来

用el-upload上传图片 以流的形式传给后台 所以用formData对象带数据 let formData new FormData() formData.append(name&#xff0c;monkey7) console.log(formData) 明明已经把数据append进去了 console.log在控制台却打印不出 后来发现他得用formData.get("xxx"…...

【Web安全】SQL注入攻击几种常见防御手法总结

文章目录 前言一、使用参数化查询二、输入验证和过滤三、使用存储过程四、最小权限原则五、使用ORM框架六、使用准备语句七、使用安全的数据库连接八、避免动态拼接SQL语句九、使用防火墙和入侵检测系统(一)防火墙(二)入侵检测系统(Intrusion Detection System,简称IDS)十、定期…...

Linux网络编程杂谈(聊聊网络编程背后的故事)

数据是如何传输到物理网络上的&#xff1f; 以TCP为例&#xff0c;当 TCP 决定发送数据时&#xff0c;这些数据需要经过多个处理阶段才能真正被传输到物理网络。其中一个关键步骤是将数据移动到网络接口卡 (NIC)。以下是这个过程的详细描述&#xff1a; 数据序列化: TCP 会为要…...

执行Maven项目时,无法解析项目的依赖关系

报错[ERROR] Failed to execute goal on project pdms-services: Could not resolve dependencies for project ..... 在IDEA ----> setting ---->Remote Jar Repositories ----> Maven jar repositories中添加远程仓库的http地址。 再次进行maven的clean和install就好…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...