发布时间:2026/9/3 21:05:07
Python消息队列:Celery上手 在上一篇的博文中, 实现了一个异步任务情景, 会在调用web服务后马上返回结果, 而后台会接着执行这个任务, 这是我工作里的一个实际需求, 在我费尽周折把这个功能编写完成后, 我才知晓有一个现成的工具能够达成这个功能, 这便是今天要学习的。这是一个有着这般特性的框架, 它简单, 灵活, 可靠, 属于分布式任务执行框架范畴, 它能够支持大量任务的并发执行情况。该框架采用典型生产者与消费者模型。生产者将任务提交到任务队列里。众多消费者从任务队列当中获取任务去执行。有这样一种设计模式被称作生产者和消费者模型, 在该模式下, 生产者是任务的发布者, 消费者是任务的获取者, 生产者与消费者不存在直接关联, 他们之间的交流借助中间人来达成, 这个中间人也被叫做消息队列。处于这个进程里, 生产者如同悬赏榜上之张贴告示者那般, 把任务投放至消息队列当中, 任务于任务队列里逐一执行完毕后, 把结果传送给消费者, 于生产环境下, 任务队列通常借助Redis予以实现。实际场景的实际场景在日常生活中经常出现举例说, 在Web应用里, 当用户引发了一个得长时间开展的操作之时高计算或者高IO等会形成阻塞的任务类型, 能够将其当作任务给予异步去执行, 执行完毕之后再返还给用户。这个时间段用户无需等待。有着这样一种情况, 对于身为用户的他而言, 在其点击了执行按钮之后, 便得到了一个任务ID, 至于程序呢, 是在后台方面执行的, 接下来, 用户所只需要做的仅仅是等上一段时间, 通过这个任务ID去拿到任务执行之后的结果便可。还有一个场景是定时任务例如需要定时向一些地址发布邮件。在着手代码之初, 我察觉到了极大的问题, 于我的设备之上运行程序之际, 一直出现报错。: not to起初, 我方才觉得那当属代码逻辑之问题, 而最终经查找发觉乃是其最新版本当下并不予以支许了, 于此情形能够采用WSL或者借助 -A --poolsolo -l info来开展执行操作。若采用如此这般的后者方式, 那就表明了是以单线程模式来对代码予以执行的。最简单的案例先是一个最为简单的案例, 我们存在一个进行计算的程序, 它承担着把输入的两个数字加起来的职责, 得以获取结果为了去模拟具备高计算量的程序, 我们于计算之际添加上秒。目前, 我们期望用户在运行该程序时间段, 程序不会因sleep长达两秒而出现阻塞状况, 而是能够于后台开展执行操作。此一过程, 我们将其放置于队列当中。想要达成这个目标, 我们需要去实现以下几个方面的内容:我们得去达成本地的一个消息代理的实现, 就像Redis那样, 我们要去实现一个生产者程序, 其职责是生成任务给消息代理发送过去, 还要去实现一个消费者程序, 在负责从消息队列那儿接收任务后去执行它们。在这个过程中生产者不负责执行程序只负责发布任务。以下是代码的实现一开始, 我们借助在本地的6379端口来开启redis服务, 在这里就不再详细叙述了。消费者程序我们命名为tasks.py。1 2 3 4 5 6 7 8 9 10 11 12import time from celery import Celery broker redis://127.0.0.1:6379 backend redis://127.0.0.1:6379/0 app Celery(my_task, brokerbroker, backendbackend) app.task def add(x, y): time.sleep(2) # 模拟耗时操作 return x y消费者程序当中, 定义了消息代理, 其是用redis实现的, 还定义了结果后端, 这也是用redis实现的。按其名称含义来说, 其中一个是用来连接消息队列的, 另一个是用来存储结果的。在起始点, 创建了一个实例, 它的称谓是。其中, app.task属于一个装饰器范畴, 该装饰器会把被其修饰的函数登记成为任务。进而使得这个函数能够以异步方式来进行调用了。生产者程序命名为.py负责发布任务。1 2 3 4 5from tasks import add # 异步任务 add.delay(2, 8) print(hello world)生产者里头, 最先导入了归消费者所有的add函数, add函数经app.task进行包装, 摇身一变成了一个任务, 到了这时候我们凭借delay方法从而能异步执行它, 且传进两个参数2, 8。执行异步任务之际, 程序并非会干等着两秒来返回结果, 而是即刻去执行下面的print(hello world), 并且add的结果会于后台开展计算然后返回。如何执行他们呢首先需要在命令行执行1celery -A tasks worker --poolsolo -l info正在开启一个用于监听队列, 而执行任务的工作进程。-A所代表的应用模块名源自tasks.per, 用以表明要开启工作进程, 进而示意日志的级别。启动后能看到成功连接的日志于是乎, 于此之际, 我们于另外的一个命令行那儿去执行.py。紧接着, 命令行便会即刻返回hello world。当此之时呀, 程序将会就在后台进行执行, 能够在进程的后台部位看到接收以及执行的结果。这样就实现了一个最简单的用例。app.task装饰器将程序包装成实例的那个, 是app.task这个装饰器, 这里面存在几个需要留意的要点。1 2 3app.task(bindTrue) def add(self, x, y): print(self.request.id)此时程序的第一个参数必须是任务实例不然拿不到任务id。1 2 3app.task(nametasks.add) # 不显式设置的话也为task.add def add(x, y): return x y1 2 3 4 5 6 7app.task(bindTrue) def send_twitter_status(self, oauth, tweet): try: twitter Twitter(oauth) twitter.update_status(tweet) except (Twitter.FailWhaleError, Twitter.LoginError) as exc: raise self.retry(excexc)或者一种更方便的方法1 2 3 4app.task(autoretry_for(FailWhaleError,), retry_kwargs{max_retries: 5}) def refresh_timeline(user): return twitter.refresh_timeline(user)Delay方法所提供的delay方法, 是一个属于异步执行的接口, 它是对另外一个接口进行的封装。在执行之后, 它们会返回一个实例, 这个实例的作用是用来跟踪任务的状态, 也就是专门用来存储这个的。结果的获取我们能够于上面所提及的代码之中直接获取结果, 以及与任务相关联的信息, 情况如下:1 2 3 4 5 6 7 8 9 10from tasks import add # 异步任务 res add.delay(2, 8) print(hello world) res.get(timeout1) # 10如果出现报错会将调用栈返回 res.id # 获取任务id res.get(propagateFalse) # 10但是不返回报错信息 res.state # 任务状态包含PENDING/STARTED/SUCCESS/FAILURE等在这儿直接获取结果, 事实上有点类似顺序执行情况。要是拿到了任务id, 那需要靠再一个不同模样的服务去查看相应任务状态该怎么操作呢?1 2 3from tasks import app # 先导入Celery实例 res app.AsyncResult(given-task-id) # 这时候就可以和上面一样获取任务结果了构建链与同样, 亦援手链式调用。设若需求于一项任务回返之后调用另外一项任务。于此便牵扯到签名。所谓签名指的乃是把一项任务的实行选项跟参数予以打包, 诸如:1 2 3add.signature((2, 2), countdown10) # 为add任务增加了22的参数和倒计时10秒的执行选项 add.s(2, 2) # 简写对于上面这个签名也可以直接执行1 2 3s1 add.s(2, 2) res s1.delay() res.get()如果使用链的话是这样的1 2 3 4 5from celery import chain from tasks import add, multiply # (4 4) * 8 chain(add.s(4,4) | multiply.s(8))().get()路由支持路由也就是根据名称将结果发到不同队列1 2 3 4 5app.conf.update( task_routes { tasks.add: {queue: add_queue}, }, )在执行时在方法中加入queue参数1 2from tasks import add add.apply_async((2, 2), queueadd_queue)并在执行时使用-Q来选择队列1celery -A tasks worker -Q add_queue读取配置文件处于上面提及的程序里, 和的配置是书写于程序之中的, 不过呢, 它同样能够被写成配置文件, 要运用 app 的方式去加载配置。必须留意, 配置文件得跟启动文件放置于同一个路径之下。举例来说:在项目路径下创建.py内容为1 2 3 4 5 6 7 8 9 10from datetime import timedelta from celery.schedules import crontab broker_url redis://127.0.0.1:6379 # 指定 Broker result_backend redis://127.0.0.1:6379/0 # 指定 Backend broker_connection_retry_on_startup True imports ( # 指定导入的任务模块 tasks, )相应的tasks.py也要修改一下修改后内容如下1 2 3 4 5 6 7 8 9 10import time from celery import Celery app Celery(demo) # Celery实例的名称 app.config_from_object(celery_config) app.task def add(x, y): time.sleep(2) # 模拟耗时操作 return x y最初的时候, 定义出来的地址以及 app 都是写在 task.py 这个文件当中的, 然而现如今, 仅仅只要在 task.py 里面直接加载配置文件就行了。2024/5/26 于苏州

相关新闻

2026/9/3 21:00:07

ESP32-C5评测:双频Wi-Fi 6 + RISC-V开启嵌入式新选择

这次我们来看乐鑫的 ESP32-C5。它最直接的卖点,是把双频 Wi-Fi 6 放进了 ESP32-C 系列:2.4GHz 和 5GHz 都能用,基带支持 802.11ax,内核换成 RISC-V,开发方式仍然是 ESP-IDF 那套。相比只支持 2.4G 的 ESP32-C3、ESP32-…

2026/9/3 21:00:07

ESP32-C5双频Wi-Fi 6芯片首测:GPIO天线切换与低功耗IoT应用实践

这次我们来看一颗芯片,而不是某个 AI 模型或开源软件:乐鑫 ESP32-C5。如果你之前在 ESP32-C3、ESP32-C6 上做过物联网项目,会明显感觉到 2.4GHz 频段在稍微密集一点的环境里就开始卡顿、丢包。ESP32-C5 这次补齐了 5GHz 频段,同时…

2026/9/3 21:00:07

OFDM通信链路MATLAB仿真:从LDPC编码到信道估计的完整物理层实现

首先明确一点:这不是一个可以“双击运行”的现成软件,而是一套完整的OFDM 通信链路 MATLAB 仿真项目。它覆盖了从发射端信源编码到接收端信号解调的完整物理层处理流程,核心模块包括LDPC 信道编码、加扰解扰、64QAM 映射、OFDM 调制、Schmidl…

2026/9/3 22:00:40

C51智能卡COS开发实战:ISO7816、APDU与掉电安全设计

简介:这是一份基于C51单片机的智能卡COS(Card Operating System)源代码工程,适合已具备一定单片机基础、希望深入卡片操作系统的嵌入式开发和信息安全学习者。资源包共115个文件,压缩后约1002KB,主要包含C源…

2026/9/3 22:00:40

用Python回合制伤害模拟器,量化攻击绳与充能绳的收益差异

在给姬子刷遗器的时候,攻击绳和充能绳的选择确实容易让人纠结。特别是手头有 01 的王棋绘世,又想在混沌回忆或虚构叙事里压到 2t、3t 时,绳子主词条甚至会影响整个输出轴。网上关于“攻击绳还是充能绳”的结论很多,但不同玩家的面…

2026/9/3 22:00:40

姬子攻击绳还是充能绳?从能量循环看懂2t/3t配装选择

姬子带攻击绳还是充能绳,01配置下到底走2t循环还是3t循环,这是很多玩家在配队时反复纠结的问题。尤其是看到“王棋绘世”这类特定玩法或阵容里,有人能两回合放大、有人三回合才放大,常误以为差在星魂或光锥。实际上,对…

2026/9/3 22:00:40

5. Java 数组核心知识点

一、数组概述1.1 什么是数组数组是相同数据类型元素的有序集合,使用一个变量名管理多个同类型数据。本质是一个固定长度的容器。1.2 核心特点特点说明类型统一数组中所有元素必须是同一数据类型(如全部 int 或全部 String)长度固定数组一旦创…

2026/9/3 22:00:40

STM32F4x7+FreeRTOS+lwIP+SSL+MQTT:从能连到稳定运行的实战指南

简介:面向STM32F4x7平台与物联网嵌入式开发者,这是一套可直接落地的网络通信工程,整合FreeRTOS、LwIP协议栈、MQTT客户端及SSL安全层,适合需要快速搭建稳定联网方案或进行二次开发的项目。资源包共1451个文件、14.37MB&#xff0c…

2026/9/3 18:28:26

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/3 14:29:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/3 14:30:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程|本地 AI 智能体 5 分钟落地,环境配置一次搞定 版本说明:Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热,它就是 OpenClaw,圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦?这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent,但真正开始部署时,往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题,还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南|使用一键包规避环境配置难题 痛点:部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖,版本冲突、环境配置耗费大量时间,OpenClaw 提供一键安装包,降低部署门槛。 适配系统&…

2026/9/3 20:43:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/3 17:51:43

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/3 21:06:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…