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

2023-12-16

在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 来下发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django系列之Celery异步框架+RabbitMQ使用 的相关文章

  • SQLite FTS4 使用特殊字符进行搜索

    我有一个 Android 应用程序 它使用 FTS4 虚拟表在 SQLite 数据库中搜索数据 它工作正常 但是当表中的数据包含特殊字符 如 或 时 SQLite MATCH 函数不会给出任何结果 我现在迷路了 谢谢 注意 默认的分词器真的
  • 生产者/消费者的不同语言

    我想知道是否可以通过 AMQP 和 RabbitMQ 对生产者和消费者使用不同的语言 例如 Java 代表生产者 python php 代表消费者 或者反之亦然 是的 AMQP 与语言无关 这意味着只要您有可以连接到 AMQP 的客户端sa
  • React 错误:目标容器不是 DOM 元素

    我刚刚开始使用 React 所以这可能是一个非常简单的错误 但我们开始吧 我的html代码非常简单 load staticfiles
  • iPhone SQLite页面缓存不断增长

    I use sqlite数据库用于存储 还有许多数据库事务 我的问题是 sqlite 页面缓存的内存使用量快速增长 在instruments我可以找到这条线 Graph Category Live Bytes Living Transien
  • 创建django权限,报错:ContentType匹配查询不存在

    我正在尝试添加两个组并授予他们对我的 Django 项目的权限 但我不断收到错误 ContentType 匹配查询不存在 我在跑步 姜戈 1 5 4 Python 2 7 3 南0 8 2 后SQL 9 3 这是我的代码 import dj
  • 在 Redis 上为 Django 和 Express.js 应用程序共享会话存储

    我想创建一个包含一些登录用户的 Django 应用程序 另一方面 由于我想要一些实时功能 所以我想使用 Express js 应用程序 现在的问题是 我不希望身份不明的用户访问 Express js 应用程序的日期 因此 我必须在 Expr
  • Django HTTPS 和 HTTP 会话

    我使用 Django 1 1 1 和 ssl 重定向中间件 通过 HTTPS 创建的会话数据 身份验证等 在站点的 HTTP 部分中不可用 无需将整个站点设置为 HTTPS 即可使其可用的最佳方法是什么 这是设计使然 您无法轻易更改 当通过
  • django orm:select_lated,用假外键欺骗反向外键除了模型之外,会出现什么问题?

    我正在尝试学习如何使用 Django 的 ORM 进行更高级的查询 而不是使用原始 sql select related进行连接以减少数据库命中 原则上它可以进行我手动执行的连接 但有一个问题 它不使用反向外键关系来制作sql 对于我的架构
  • 检索 geodjango 多边形对象的边界框

    如何在 geodjango 中获取 MultiPolygon 对象的边界框 在 API 中找不到任何内容http geodjango org docs geos html http geodjango org docs geos html
  • “从表中选择不同的字段名称”Django使用原始sql

    我怎样才能跑SELECT DISTINCT field name from table Django 中的 SQL 查询为raw sql 当我尝试使用时Table objects raw SELECT DISTINCT field name
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • Django 模板标签内字符串连接最佳实践

    我正在尝试连接一些字符串以格式化模板标记内的 URL 但我找不到一种优雅的方法 到目前为止 我所拥有的是 button Activate http site domain url registration activate activati
  • “一旦获取切片就无法更新查询”。最佳实践?

    由于我的项目的性质 我发现自己不断地从查询集中取出切片 如下所示 Thread objects filter board requested board id order by updatedate 10 但这给我带来了实际对我选择的元素进
  • Django通用外键和select_相关

    我试图使用与通用外键的关系来选择模型 但它没有按预期工作 我认为用代码可以更好地说明和理解 class ModelA models Model created models DateTimeField auto now add True c
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • ModelChoiceField 在提交表单时给出无效选择错误

    我想允许用户删除特定模型的关联外键列表 假设我们有这两个模型 class IceBox models Model class FoodItem models Model name models CharField icebox models
  • 在 Bootstrap 中使单击的选项卡处于活动状态

    我正在使用 Django 并将 Bootstrap 与 Django 集成 这是我的导航栏 HTML 代码 div class navbar navbar default navbar fixed top div class contain
  • 如何在 Django 中使我的模型字段可选?

    我正在尝试遵循底部的完整示例 https docs djangoproject com en dev topics auth customizing https docs djangoproject com en dev topics au

随机推荐

  • 低代码开发:属于“美味膳食”还是“垃圾食品”

    目录 引言 低代码是什么 低代码的优点 使用挑战 未来展望 最后 引言 随着数字化转型的迅猛发展 低代码开发平台逐渐成为了企业和开发者的关注焦点 尤其是前两年低代码的迅速火爆 来势汹汹 号称要让大部分程序员下岗的功能 但是过了不到三年时间
  • 程序员养生指南

    目录 前言 调整工作习惯 保持合理饮食 积极参与活动 保持良好睡眠 精神调适与放松 结语 前言 不用多说 想必都知道程序员是一份高强度 高压力 高危 的职业 长期坐姿 熬夜加班等不良生活习惯会对人的身体健康造成负面影响 长时间的工作 高强度
  • Vue:用IDEA开发Vue,标签语法爆红问题处理

    一 场景描述 我在 IDEA 中 学习 Vue 课程 入门学习时 是在 html 文件中 script 引入 vue js 文件方式 此时 在 html 文件中用 v 标签 爆红 二 解决办法 打开 菜单栏 File Settings 选择
  • 展会回顾|CASAIM应邀参加一汽大众秋季创新科技展,展出最新的第二代CASAIM-IS自动化测量系统

    11月30日至12月1日 CASAIM应邀参加一汽大众秋季创新科技展 展出最新的第二代CASAIM IS自动化测量系统 现场一汽大众相关领导和成员及其他厂商莅临参观 就自动化测量技术应用进行深入交流和探讨 第二代CASAIM IS自动化测量
  • 参加2023谷歌开发者社区 DevFest的洞察与感悟

    目录 前言 关于GDG 主会场精彩分享 分会场干货满满 共创未来之旅 参会体验 结束语 前言 在12月10日 DevFest又一次来临了 潮流与技术的光芒同时绽放 作为一名热衷技术的开发者 我有幸参与了这次盛会 也非常荣幸能够和线上三十万开
  • 通信子网在计算机网络中的地位和作用

    一 通信子网是计算机网络的核心组成部分 通信子网是计算机网络的核心组成部分 它负责为计算机网络中的各种设备提供通信支持 无论是主机之间的数据传输 还是主机与终端之间的数据通信 都需要通过通信子网来实现 通信子网是连接各个设备的关键基础设施
  • 大揭秘!Python处理办公自动化的10大场景!

    知乎上有个热门问题 Python 未来会成为大众办公常用编程工具吗 在编程世界里 Python已经是名副其实的网红了 曾经一个学汉语言的研究生 问我怎么学Python 因为他们课程论文里需要用到文本分析 用Python来跑数据 我和他说 你
  • 计算机网络中的通信子网主要有哪些功能?

    计算机网络中的通信子网主要具有以下功能 负责全网的数据通信 通信子网通过使用各种通信协议和传输控制功能 能够确保数据从一台主机安全 准确地传输到另一台主机 这包括数据的封装 解封装 传输控制 差错控制等过程 完成各种网络数据的处理 转换和交
  • 计算机网络中的通信子网:架构、协议与技术简介

    在计算机网络中 通信子网是负责实现主机之间以及主机与终端之间数据传输的核心部分 它由一系列硬件设备和通信协议组成 为上层应用提供可靠 高效和透明的数据传输服务 本文将详细介绍通信子网的架构 协议与技术 一 通信子网的架构 星型拓扑 星型拓扑
  • Python爬虫是否合法?

    Python爬虫是否合法的问题颇具争议 主要涉及到使用爬虫的目的 操作方式以及是否侵犯了其他人的权益 本文将介绍Python爬虫的合法性问题 并提供一些相关的法律指导和最佳实践 1 什么是Python爬虫 Python爬虫是一种自动化程序
  • 学python如何办公自动化?学这些就够了

    我们天天都在忙 究竟在忙些什么 查找各种文件 在一个个文件夹里来回穿梭 在TXT XLS XLSX DOC DOCX PPT PDF文档之间来回切换 复制 粘贴 运指如飞 打开几十个网页 以便及时获取信息 将各种数据输入系统 以及把数据填写
  • 超实用!34 个 Python 自动化办公库清单!

    今天给大家分析34个常用的Python自动化办公库 本次内容涵盖了 Excel Word PPT ODF PDF 邮件 微信 文件处理等所有能在办公场景实现自动化的库 希望能够对大家有所帮助 Python Excel自动化库 1 xlwin
  • wireshark使用

    1 抓包界面介绍 2 过滤 1 ip过滤 or 端口过滤 ip src 192 168 1 104 显示源地址为192 168 1 104的数据包列表 ip dst 192 168 1 104 显示目标地址为192 168 1 104的数据
  • 如何自学成 Python 大神?这里有些建议

    人生苦短 我用 Python 为什么 简单明了的理由当然是开发效率高 但是学习 Python 的初学者往往会面临以下残酷的现状 网上充斥着大量的学习资源 书籍 视频教程和博客 但是大部分都是讲解基础知识 不够深入 也有的比较晦涩 难以理解
  • 这或许是最全的 Python 数据分析指南(全)

    因工作需求经常会面试一些数据分析师 一些 coding 能力很强的小伙伴 当被问及数据分析方法论时一脸懵逼的 或者理所当然的认为就是写代码啊 在文章开头先来解释一下数据分析 数据分析是通过明确分析目的 梳理并确定分析逻辑 针对性的收集 整理
  • Python爬虫入门(一)

    前言 很多人都或多或少听说过 Python 爬虫 我也一直很感兴趣 所以也花了一个下午入门了一下轻量级的爬虫 为啥是轻量级的爬虫呢 因为有的网页是比较复杂的 比如需要验证码 登录验证或者需要证书才能访问 我们了解爬虫的概念和架构 只需要做一
  • Python爬虫 (适合初学者)

    关于爬虫是什么 怎样保证爬虫的合法性小编在这就不再过多的阐述 从本章起 小编将和大家一起分享在学习python爬虫中的所学 希望可以和大家一起进步 也希望各位可以关注一下我 首先我们来初步了解下如何使用开发者工具进行抓包 以 https f
  • std::iota 函数简单使用

    std iota 是 C 标准库中的一个算法 位于
  • LeetCode-周赛-思维训练-中等难度

    第一题 1798 你能构造出连续值的最大数目 解题思路 我们先抛开原题不看 可以先完成一道简单的题目 假设现在就给你一个目标值X 问你能够构造出从 1 X 的连续整数 最小需要几个数 贪心假设 期望 我们要尽量用最少的数目 构造出最长的连续
  • Django系列之Celery异步框架+RabbitMQ使用

    在Django项目中 如何集成使用Celery框架来完成一些异步任务以及定时任务呢 1 安装 pip install celery celery框架 pip install django celery beat celery定时任务使用 p