使用 `Celery` 配合 `RabbitMQ` 作为消息代理,实现异步任务的调度、重试、定时任务以及错误监控等功能
python基础代码、优化、扩展和监控的完整示例。此示例使用 Celery
配合 RabbitMQ
作为消息代理,实现异步任务的调度、重试、定时任务以及错误监控等功能。
项目结构
我们将项目结构组织如下,以便代码逻辑清晰且易于扩展:
project/
│
├── celery_app.py # Celery应用的配置和初始化
├── tasks.py # 异步任务的定义
├── monitor.py # 异常监控和报警
└── main.py # 测试异步任务调用
1. celery_app.py
- 配置 Celery 应用
# celery_app.py
from celery import Celery
from celery.schedules import crontabapp = Celery('tasks', broker='amqp://localhost//', backend='redis://localhost')# 基础配置
app.conf.update(result_expires=3600, # 任务结果过期时间task_acks_late=True, # 确保任务执行后才确认完成worker_prefetch_multiplier=1, # 单次预取任务数task_serializer='json', # 任务数据序列化格式result_serializer='json', # 任务结果序列化格式accept_content=['json'], # 仅接收json格式task_soft_time_limit=300, # 软超时时间task_time_limit=600, # 硬超时时间worker_hijack_root_logger=False, # 不劫持主日志worker_log_format='[%(asctime)s: %(levelname)s/%(processName)s] %(message)s',
)# 定时任务配置
app.conf.beat_schedule = {'scheduled_add': {'task': 'tasks.add','schedule': crontab(hour=7, minute=30, day_of_week=1),'args': (16, 16),},
}# 任务路由配置:不同的任务可以走不同的队列
app.conf.task_routes = {'tasks.add': {'queue': 'high_priority'},
}
2. tasks.py
- 定义任务
# tasks.py
from celery_app import app
from monitor import task_failure_handler
import time# 定义基础任务
@app.task(bind=True, max_retries=3)
def add(self, x, y):try:time.sleep(5) # 模拟耗时任务return x + yexcept Exception as exc:raise self.retry(exc=exc, countdown=5) # 5秒后重试
3. monitor.py
- 监控与报警
# monitor.py
from celery.signals import task_failure@task_failure.connect
def task_failure_handler(sender=None, exception=None, **kwargs):# 发送报警通知或记录错误日志print(f"[ALERT] Task {sender.name} failed due to {exception}")
4. main.py
- 测试任务调用
# main.py
from tasks import add
from celery_app import appif __name__ == "__main__":# 启动异步任务result = add.delay(4, 6)print("Task state:", result.state) # 打印任务状态print("Result:", result.get()) # 获取任务结果(阻塞等待)# 组合任务示例:Groupfrom celery import groupgroup_tasks = group(add.s(i, i) for i in range(10))group_result = group_tasks.apply_async()print("Group Result:", group_result.get())# 链式任务示例:Chordfrom celery import chordcallback = add.s(10, 20)chord_tasks = chord((add.s(i, i) for i in range(10)), callback)chord_result = chord_tasks.apply_async()print("Chord Result:", chord_result.get())
运行和监控
-
启动 RabbitMQ 服务:
sudo service rabbitmq-server start
-
启动 Celery Worker:
运行以下命令,指定high_priority
队列处理高优先级任务。celery -A celery_app worker -Q high_priority,default -l info
-
启动 Celery Beat(用于调度定时任务):
celery -A celery_app beat -l info
-
启动 Flower 实时监控(可选):
celery -A celery_app flower --port=5555
访问
http://localhost:5555
进行任务和 worker 状态的实时监控。 -
Prometheus 和 Grafana 监控(可选):
配置 Celery 的自定义事件,并使用 Prometheus 采集数据,再通过 Grafana 可视化 Celery 的性能指标。
此示例项目具有以下特性:
- 异步任务:通过
delay()
方法调用。 - 重试机制:在任务异常时自动重试。
- 任务调度:支持定时任务,利用
Celery Beat
实现周期性任务调度。 - 报警机制:在任务失败时发送报警或日志记录。
- 监控系统:使用
Flower
进行实时监控,支持 Prometheus 和 Grafana 扩展。
相关文章:
使用 `Celery` 配合 `RabbitMQ` 作为消息代理,实现异步任务的调度、重试、定时任务以及错误监控等功能
python基础代码、优化、扩展和监控的完整示例。此示例使用 Celery 配合 RabbitMQ 作为消息代理,实现异步任务的调度、重试、定时任务以及错误监控等功能。 项目结构 我们将项目结构组织如下,以便代码逻辑清晰且易于扩展: project/ │ ├──…...

react-router与react-router-dom的区别
写法上的区别: 写法1: import {Swtich, Route, Router, HashHistory, Link} from react-router-dom;写法2: import {Switch, Route, Router} from react-router; import {HashHistory, Link} from react-router-dom;react-router实现了路由的核心功能 react-router-…...

【研究生必看】把选题和文献交给AI,轻松搞定毕业论文!
在学习和研究的过程中,选题和文献录入真的是让人头疼的事情。面对一堆资料,很多时候我们会感到无从下手,甚至有点焦虑。不过,大家别担心!现在有了像“梅子AI论文”这样的工具,可以帮助我们轻松搞定这些问题…...

Android中同步屏障(Sync Barrier)介绍
在 Android 中,“同步屏障”(Sync Barrier)是 MessageQueue 中的一种机制,允许系统临时忽略同步消息,以便优先处理异步消息。这在需要快速响应的任务(如触摸事件和动画更新)中尤为重要。 在 An…...

真·香!深度体验 zCloud 数据库云管平台 -- DBA日常管理篇
点击蓝字 关注我们 zCloud 作为一款业界领先的数据库云管平台,通过云化自治的部署能力、智能巡检和诊断能力、知识即代码的沉淀能力,为DBA的日常管理工作带来了革新式的简化与优化。经过一周的深度体验,今天笔者与您深入探讨 zCloud 在数据库…...
优雅的遍历JSONArray,获取里面的数据
最近看到有个同事在遍历json数组的时候,用for循环写了一层有一层,那么是否有简便的写法呢?当然有了,下面就有用流的行驶,优雅的遍历数组,获取我们想要的数据 public static void main(String[] args) {Str…...

C#:强大而优雅的编程语言
在当今的软件开发领域,C#作为一种广泛应用的编程语言,以其强大的功能、优雅的语法和丰富的生态系统,受到了众多开发者的喜爱。本文将深入探讨 C#的各个方面,展示它的魅力和优势。 一、C#的历史与发展 C#是由微软公司开发的一种面…...

一个由Deno和React驱动的静态网站生成器
大家好,今天给大家分享一个由 Deno React 驱动的静态网站生成器Pagic。 项目介绍 Pagic 是一个由 Deno React 驱动的静态网站生成器。它配置简单,支持将 md/tsx 文件渲染成静态页面,而且还有大量的官方或第三方主题和插件可供扩展。 核心…...
Python pyautogui库:自动化操作的强大工具
在Python的众多强大库中, pyautogui库脱颖而出,成为了实现自动化操作的得力助手。它允许你通过编程控制鼠标和键盘操作,无论是进行自动化测试、创建宏,还是进行一些重复性的任务,pyautogui都能发挥巨大的作用。 一、安…...

【HTML】——VSCode 基本使用入门和常见操作
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 零:HTML开发工具VSCode的使用 1:创建项目 2:创建格式模板&#x…...

从0开始搭建一个生产级SpringBoot2.0.X项目(八)SpringBoot 使用Redis
前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot使用Redis 缓存数据 一、 pom引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>&…...

Ubuntu20.04两种安装及配置中文界面、输入法、换源、共享文件夹实现,及注意事项
虚拟机安装法 1、新建虚拟机,自定义下一步 任意指定路径 提高处理器数量能加快系统响应 完成以后不要运行,添加镜像文件 导入镜像文件,点击浏览 选择后打开->确认->运行虚拟机 出现这种情况就需要检查虚拟机的配置,操作系统…...

后端Java学习:springboot之文件上传(阿里云OSS存储)
一、什么是阿里云存储? 阿里云对象存储OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。 二、阿里云…...

python通过lunarcalendar库使用农历日期
农历日期库 介绍 lunarcalendar是一个处理农历日期的库 可以简单通过pip安装:pip install lunarcalendar lunarcalendar的github地址 从公历转为农历 from lunarcalendar import Converter, Solarsolar Solar(2024, 11, 1) lunar Converter.Solar2Lunar(sola…...
MySQL高级--范式与反范式
MySQL高级–范式与反范式 1. 背景 首先让我们来简单了解什么是范式与反范式 如下有部门表(包含:雇员、部门、部门领导) EMPLOYEEDEPARTMENTHEADJonesAccountingJonesSmithEngineeringSmithBrownAccountingJonesGreenEngineeringSmith 我们…...
实验05多重循环---7-02 打印矩形图案
打印一个 m 行 n 列的字符 * 组成的矩形图案。 输入格式: 输入在一行中给出空格隔开的两个整数,分别表示行数 m 和列数 n,其中 m 和 n 分别满足 1≤m≤10,1≤n≤20。 输出格式: 由字符 * 组成的 m 行 n 列的矩形图案。 输入样例: 3 5 输出…...

明源地产ERP WFWebService.asmx 反序列化RCE漏洞复现
0x01 产品简介 明源地产ERP是一款专为房地产行业设计的企业资源规划(ERP)系统,系统集成了项目管理、财务管理、客户关系管理、营销管理等多个模块,旨在帮助房地产企业提升运营效率、降低成本和提高客户满意度。它充分考虑了房地产行业的特性和需求,通过整合企业的各个业务…...
学习笔记:黑马程序员JavaWeb开发教程(2024.11.4)
5.8 请求响应-请求-案例 数据保存在emp.xml文件中,解析XML的工具类XMLParserUtils,其中使用了dom4j的接口,因此要在pom.xml文件中引入dom4j的依赖,用于解析XML文件,实体类Emp用于封装服务器解析的数据 前端页面文件…...

开源自托管数据管理工具全面指南
在大数据时代,企业和组织面临着海量的数据挑战。随着应用程序复杂性的提高以及用户需求不断演变,开发团队需要高效地处理大量数据,以便快速做出决策。然而,在众多信息中,如何识别并有效利用那些对决策至关重要的数据呢…...

护工系统|护工陪护软件|护工系统设计
在现代社会,护工系统的开发成为提升医疗服务质量和效率的重要手段。页面设计作为系统开发的关键环节,必须充分考虑到实用性与用户体验。以下是对护工系统开发页面设计功能的详细阐述: 一、用户登录与权限管理 页面设计首先应设置用户登录模块…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...