Django系列之Celery异步框架+RabbitMQ使用

在Django项目中,如何集成使用Celery框架来完成一些异步任务以及定时任务呢?

1. 安装

pip install celery		# celery框架
pip install django-celery-beat		# celery定时任务使用
pip install django-celery-results		# celery存储结果使用

2. Django集成celery

settings.py 配置文件中增加如下配置项:

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


"""以下是celery的相关配置"""
# 时区配置
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False
DJANGO_CELERY_BEAT_TZ_AWARE = False

# broker backend 配置:使用rabbitmq作为中间件
CELERY_BROKER_URL = "amqp://devops:devops123@127.0.0.1:5672/alarm"
CELERY_RESULT_BACKEND = "amqp://devops:devops123@127.0.0.1:5672/alarm"

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

# celery序列化和反序列化配置
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'pickle'
CELERY_ACCEPT_CONTENT = ['pickle', 'json']

# 下面配置项在有些情况下可以防止死锁  非常重要!
CELERYD_FORCE_EXECV = True
# 任务结果存储的过期时间,默认1天过期。如果beat开启,Celery每天会自动清除,设为0,存储结果永不过期。
CELERY_RESULT_EXPIRES = 60 * 60 * 24
# 每个worker执行1000次任务后死掉,会自动重启worker,防止任务占用太多内存导致内存泄漏
CELERY_MAX_TASKS_PER_CHILD = 1000
# 禁用所有速度限制,如果网络资源有限,不建议开足马力。
CELERY_DISABLE_RATE_LIMITS = True
# 单个任务的运行时间限制,否则会被杀死
CELERYD_TASK_TIME_LIMIT = 60 * 60
CELERY_TASK_RETRY = 2

# celery 队列配置
from kombu import Exchange, Queue
# consumer_arguments设置队列的优先级
CELERY_TASK_QUEUES = (
    Queue('alarm_queue', Exchange('alarm_exchange'), routing_key='alarm_email', consumer_arguments={'x-priority': 5}),
    Queue('alarm_queue', Exchange('alarm_exchange'), routing_key='alarm_phone', consumer_arguments={'x-priority': 8}),
    Queue('calcu_queue', Exchange('calcu_exchange'), routing_key='calcu_feature', consumer_arguments={'x-priority': 10})
)

CELERY_TASK_ROUTES = {
    'alarm.tasks.call_phone': {'queue': 'alarm_queue', 'routing_key': 'alarm_phone'},
    'alarm.tasks.send_email': {'queue': 'alarm_queue', 'routing_key': 'alarm_email'},
    'calcu.tasks.execute_calcu': {'queue': 'calcu_queue', 'routing_key': 'calcu_feature'},
}

settings.py 同级目录下,新增一个 celery.py 文件:

from __future__ import absolute_import, unicode_literals    # absolute_import: 使用python的库而不是项目目录下的文件
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "celerymq.settings")
celery_app = Celery("celerymq")

celery_app.config_from_object("django.conf:settings", namespace="CELERY")
celery_app.autodiscover_tasks(settings.INSTALLED_APPS)

在App中增加一个 tasks.py 文件,用于实现异步任务:

import time
from celery import shared_task

@shared_task(ignore_result=True)
def execute_calcu(dataframe):
    print(f'execute celery task: calcu feature')
    time.sleep(10)		# 这里写比较耗时的逻辑
    print(f'execute calcu feature task run over')

在其他文件逻辑中进行异步调用:

execute_calcu.delay(dataframe)

项目启动后,如果有异步任务进来,可以在 RabbitMQ 监控平台看到队列信息: http://127.0.0.1:15672/
在这里插入图片描述

3. 启动命令

启动 worker 去消费数据。

# 启动worker
celery worker -A celerymq -l INFO -n alarm_queue -Q alarm_queue -P eventlet

# 启动beat
celery beat -A celerymq -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler

在linux中启动worker的话,可以去掉 -P eventlet 参数。

另外,定时任务推荐使用 django-admin 来下发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

URIBuilder与SSRF

在使用一个静态扫描工具时,报了一个SSRF的问题,经过数据流的分析,导致此工具报SSRF的原因是在调用URIBuilder的setPath函数时,参数是从请求里获取的,导致了数据流被污染,因此认为由URIBuilder构造的URL也被…

作为一个产品经理带你了解Axure的安装和基本使用

1.Axure的简介 Axure是一种强大的原型设计工具,它允许用户创建交互式的、高保真度的原型,以及进行用户体验设计和界面设计。Axure可以帮助设计师和产品经理快速创建和共享原型,以便团队成员之间进行沟通和反馈。Axure提供了丰富的交互组件和功…

【EI会议征稿中|JPCS出版】第三届电子与集成电路技术国际学术会议(EICT 2024)

第三届电子与集成电路技术国际学术会议(EICT 2024) 2024 3rd International Conference on Electronics and Integrated Circuit Technology 第三届电子与集成电路技术国际学术会议(EICT 2024)将于2024年4月12至14日在南昌市举行…

Vue3封装一个轮播图组件

先看效果 编写组件代码 CarouselChart.vue <template><div classimg-box><el-button clickpreviousImages v-ifprops.showBtn>←</el-button><div classimg><div styledisplay: flex;gap: 20px idmove><imgclassimg-item v-for(item…

Github上火爆的个人知识管理AI大脑:Quivr

Github上火爆的个人知识管理AI大脑&#xff1a;Quivr。 演示视频&#xff1a; Github上火爆的个人知识管理AI大脑&#xff1a;Quivr 点击上面视频观看&#xff01;&#xff01;&#xff01; II. Quivr 的强大功能 与文件和应用程序聊天 把你的文件和应用看成你的对话伙伴&…

“险棋”更是“好棋”,鸿蒙生态为什么值得加入?

作者 | 曾响铃 文 | 响铃说 支付宝大张旗鼓与鸿蒙合作后&#xff0c;已经有高德地图、哔哩哔哩、阿里钉钉、美团、支付宝、小红书等十多个领域的独角兽企业集体宣布将开发鸿蒙原生应用&#xff0c;携手华为共同推动鸿蒙生态发展。 早前&#xff0c;有关华为鸿蒙系统可能将于…

Java中的IO流③——转换流、序列化流、反序列化流、打印流

目录 转换流 代码演示 总结 序列化流&反序列化流 序列化流 构造和成员方法 细节 代码演示 反序列化流 代码演示 序列化流和反序列化流细节 综合练习 打印流 字节打印流 代码演示 字符打印流 代码演示 总结 转换流 转换流可以将字节流转成字符流&#xff0…

【MySQL】:表的操作

表的操作 一.创建表二.查看表结构三.修改表四.删除表 一.创建表 field 表示列名。 datatype 表示列的类型。 character set 字符集&#xff0c;如果没有指定字符集&#xff0c;则以所在数据库的字符集为准。 collate 校验规则&#xff0c;如果没有指定校验规则&#xff0c;则以…

侯捷C++ 程序的生前死后

生前&#xff1a;CRT startup code 看完课程&#xff0c;能够回答一下问题&#xff1a; C进入点是main()嘛&#xff1f;什么代码比main更早执行&#xff1f;什么代码在main结束后执行&#xff1f;为什么上述代码可以如此行为&#xff1f;Heap的结构如何&#xff1f;I/O的结构…

redis(设置密码)配置文件详细

1.设置账号密码端口 config set requirepass 123456 设置密码为123456 config get requirepass 查看账号密码 auth 123456 登入的时候输入这个确定账号密码 1. 首先连接到Redis服务器: redis-cli 2. 然后使用CONFIG SET命令设置requirepass参数并指定密码: CONFIG SET requi…

代码随想录二刷| 二叉树 |二叉树的所有路径

代码随想录二刷&#xff5c; 二叉树 &#xff5c;二叉树的所有路径 题目描述解题思路递归 代码实现递归 题目描述 257.二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节…

AP9111手电筒专用集成电路芯片 单节干电池 LED手电筒IC

概述 AP9111 是 LED 手电筒专用集成电路芯片 &#xff0c;是一款采用大规模集成电路技术&#xff0c;专门针对单节干电池的 LED 手电筒设计的一款专用集成电路。外加 1 个电感元件&#xff0c;即可构成 LED 手电筒驱动电路板。AP 9111 性能优越、可靠性高、使用简单、生产一致…

Java - JVM内存区域的划分

Java 程序运行时&#xff0c;需要在内存中分配空间。为了提高运算效率&#xff0c;就对空间进行了不同区域的划分&#xff0c;因为每一片区域都有特定的处理数据方式和内存管理方式。 分配&#xff1a;通过关键字new创建对象分配内存空间&#xff0c;对象存在堆中。 释放 &…

编译 Flink代码

构建环境 JDK1.8以上和Maven 3.3.x可以构建Flink&#xff0c;但是不能正确地遮盖某些依赖项。Maven 3.2.5会正确创建库。所以这里使用为了减少问题选择 Maven3.2.5版本进行构建。要构建单元测试&#xff0c;请使用Java 8以上&#xff0c;以防止使用PowerMock运行器的单元测试失…

011 数据结构_哈希

前言 本文将会向你介绍哈希概念&#xff0c;哈希方法&#xff0c;如何解决哈希冲突&#xff0c;以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经…

【MATLAB】基于CEEMDAN分解的信号去噪算法(基础版)

代码的使用说明 【MATLAB】基于CEEMDAN分解的信号去噪算法&#xff08;基础版&#xff09; 代码流程图 代码效果图 获取代码请关注MATLAB科研小白的个人公众号&#xff08;即文章下方二维码&#xff09;&#xff0c;并回复CEEMDAN去噪 本公众号致力于解决找代码难&#xff0c;…

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列 1、队列&#xff1a;先进先出 队列是项的有序集合&#xff0c;其中&#xff0c;添加新项的一端称为队尾&#xff0c;移除项的另一端称为队首。一个元素在从队尾进入队列后&#xff0c;就会一直向队首移动&#xff0c;直到…

最大上升子序列和

欢迎大家到我的博客浏览&#xff0c;请点击 YinKai s Blog。 题目&#xff1a;最大上升子序列和 一个数的序列 bi&#xff0c;当 b1<b2<…<bS 的时候&#xff0c;我们称这个序列是上升的。 对于给定的一个序列(a1,a2,…,aN)&#xff0c;我们可以得到一些上升的子序列…

c语言中怎么把字符串变成浮点型

大家好&#xff0c;今天给大家介绍c语言中怎么把字符串变成浮点型&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 可以使用Python内置函数float()将字符串转换为浮点型。例如&a…

应对复杂环境:配网故障定位系统的挑战与解决方案

随着电力系统的不断发展&#xff0c;配电网络日益庞大&#xff0c;复杂的环境和多样化的故障类型给电网运维带来了巨大的挑战。为了提高配电网络的安全性和可靠性&#xff0c;需要研发一套高效的配网故障定位系统。恒峰智慧科技将探讨这一系统面临的挑战以及解决方案。 一、监测…