Python消息队列:Celery上手

发布时间:2026/11/5 10:44:23

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/10/29 22:37:37

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/10/24 17:13:58

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

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

2026/10/28 1:05:12

全面覆盖·场景贴合·高兼容 医疗行业API安全合规落地解决方案

一、方案概要:全维度落地的医疗API安全合规实效体系提示:本段基于医疗数字化API流转现状、合规标准与落地实测数据,概述方案技术架构、核心优势与实战价值,明确行业适配性。本方案基于全知科技知影-API风险监测系统,依…

2026/11/5 10:43:56

工业测温方案解析:ADS122U04与STM32F042K6的UART高精度RTD采集设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 10:43:56

STM32L031+ADS122U04:UART接口24位ADC实现PT100高精度温度采集

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 10:43:55

基于ADS122U04与MK24的HVAC高精度温度采集系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 10:38:55

Univer开源Web Office引擎:Canvas渲染与协同编辑实战解析

第一次看到Univer这个项目名字的时候,我下意识以为是哪个海外团队用“University”做的教育类产品。直到我翻完它的仓库和在线Demo,才发现自己差点错过一个好东西——这是一个把“在线电子表格、文档、幻灯片”全部做成开源引擎的Web Office项目&#xf…

2026/11/5 10:38:55

Foxmail数字签名与加密配置全指南:S/MIME证书实战落地

1. 邮件签名与加密不是“加个水印”或“点个锁图标”那么简单很多人第一次在Foxmail里找“签名”功能,点开设置就以为万事大吉——填上姓名、电话、公司logo,保存退出,邮件发出去带个固定落款,就觉得“搞定”。等真遇到客户问“你…

2026/11/5 10:38:55

LVS负载均衡优化:FWM标记与持久化服务实践

1. 为什么需要优化LVS调度?在企业级负载均衡场景中,Linux Virtual Server(LVS)作为四层负载均衡的经典解决方案,其性能表现直接影响着整个业务系统的稳定性。但在实际生产环境中,我们常常会遇到两个典型问题…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑