当前位置: 首页 > news >正文

使用 Celery + Redis + Eventlet 实现 Python 异步编程(Windows 环境)


一、环境搭建与依赖安装

1. 安装依赖包

pip install celery redis eventlet
  • celery:异步任务队列框架。
  • redis:作为消息中间件(Broker)和结果存储(Backend)。
  • eventlet:用于 Windows 环境下的协程支持(解决多进程兼容性问题)。

2. 启动 Redis 服务

  • 下载 Windows 版本 Redis
    https://github.com/tporadowski/redis/releases
    
  • 启动 Redis 服务
    redis-server.exe redis.windows.conf
    

二、代码实现

在这里插入图片描述

1. 定义 Celery 任务(tasks.py

import time
from celery import Celery# 创建 Celery 实例,指定 Broker(Redis)和结果存储(Redis)
broker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery('tasks',broker=broker,  # Redis 队列backend=backend   # Redis 结果存储
)@app.task
def add(x, y):"""异步加法任务"""print("x+y的结果:", x+y)time.sleep(1)return x + y

2. 调用任务(demo.py

from tasks import addresult = add.delay(62, 4)  # 异步调用任务,返回 AsyncResult 对象
print(result.get())  # 阻塞等待任务结果

三、问题现象与解决方案

1. 问题:result.get() 阻塞无输出

现象描述

执行 demo.py 时,result.get() 会一直阻塞,直到启动 Celery Worker 后才输出结果。

原因分析
  • Celery 的异步执行流程
    1. add.delay(62, 4) 将任务发送到 Redis 队列(Broker)。
      在这里插入图片描述

    2. Worker 未启动 时,任务无法被消费,结果不会写入 Backend。

    3. result.get() 会尝试从 Backend 获取结果,但因结果未写入,会 无限等待

解决方案
  • 启动 Celery Worker
    celery -A tasks worker -l info -P eventlet
    
    • -P eventlet:指定使用 Eventlet 协程池(Windows 必须)。

    • 启动后,Worker 会从 Redis 队列中拉取任务并执行,结果写入 Redis Backend。
      在这里插入图片描述
      在这里插入图片描述

    • result.get() 会立即返回结果。
      在这里插入图片描述


四、Celery 异步原理详解(测试工程师友好版)

1. Celery 的核心架构

Celery 是一个 生产者-消费者 模型,由三部分组成:

  1. Broker(消息中间件)

    • 作用:存储待执行的任务队列。
    • 类比:快递公司的分拣中心,接收包裹(任务)并分发给快递员(Worker)。
  2. Worker(任务执行单元)

    • 作用:从 Broker 拿取任务并执行。
    • 类比:快递员,负责派送包裹(执行任务)。
  3. Backend(结果存储)

    • 作用:存储任务执行结果。
    • 类比:快递柜,任务完成后将结果存入,供用户(调用方)查询。

2. 异步执行流程图解

调用 add.delay(62, 4) → 任务写入 Redis(Broker)↓
Worker 启动后从 Redis 拿取任务 → 执行 add(62, 4)↓
执行结果写入 Redis(Backend)↓
调用 result.get() → 从 Redis 读取结果 → 输出 66

3. 为什么需要 Eventlet?

  • Windows 的限制
    Windows 不支持多进程(multiprocessing),而 Celery 默认使用多进程模式。
  • Eventlet 的作用
    通过 协程(Coroutine) 实现并发,模拟多线程效果,解决 Windows 环境下 Worker 启动失败的问题。

五、测试工程师的异步思维训练

1. 同步 vs 异步

场景同步(阻塞)异步(非阻塞)
发送邮件用户等待邮件发送完成再继续操作邮件在后台发送,用户可继续操作
文件处理用户必须等待文件处理完成处理完成后通知用户

2. 异步编程的核心思想

  • 事件驱动:任务遇到 I/O(如网络请求、文件读写)时,主动让出 CPU,执行其他任务。
  • 事件循环:不断检查任务状态,调度协程执行(如 asyncio 的事件循环)。

六、完整示例验证

1. 启动 Redis

可参考往期文章:Redis原理与Windows环境部署实战指南:助力测试工程师优化Celery调试

redis-server.exe redis.windows.conf

2. 启动 Celery Worker

celery -A tasks worker -l info -P eventlet

3. 运行 demo.py

python demo.py

输出结果

66

七、总结

1. 关键点回顾

  • Celery + Redis:生产者将任务写入 Redis,Worker 从 Redis 拿取任务并执行,结果存回 Redis。
  • Eventlet 的必要性:解决 Windows 环境下的多进程兼容性问题。
  • 异步的本质:通过事件驱动和协程实现高并发,避免阻塞主线程。

2. 测试工程师的实践建议

  • 验证异步任务:通过 result.get() 验证结果是否写入 Backend。
  • 监控任务状态:使用 result.status 查看任务状态(PENDING/SUCCESS/FAILURE)。
  • 调试技巧:检查 Redis 中的键值对,确认任务是否被正确处理。

通过以上步骤,你可以在 Windows 环境下轻松实现 Celery + Redis + Eventlet 的异步编程方案。异步编程的核心在于“让等待时间做其他事”,而 Celery 让你无需关心底层细节,专注于任务逻辑本身!

相关文章:

  • Python爬虫实战:获取百度学术专题文献数据并分析,为读者课题研究做参考
  • VRM Add-on for Blender 学习笔记
  • 第7章-3 维护索引和表
  • 【Qt】Qt 构建系统详解:qmake 入门到项目实战
  • LVGL-对象 lv_obj_t
  • 基于Qt的app开发第六天
  • 东方泵业,室外消火栓泵 2#故障灯亮,报警生响
  • 词编码模型和回答问题的LLM是否为同一个; 词编码模型和回答问题模型分开时:需要保证词嵌入维度一致吗
  • STM32--TIM--函数
  • 【iOS】源码阅读(三)——内存对齐原理
  • 4G与5G网络频率:技术演进与应用场景解析
  • 自动化创业机器人:现状、挑战与Y Combinator的启示
  • XMP-Toolkit-SDK 编译与示例程序
  • WordPress:Locoy.php火车头采集
  • 手持小风扇方案解说---【其利天下技术】
  • 基于SpringBoot和PostGIS的应急运输事件影响分析-以1.31侧翻事故为例
  • nginx性能优化与深度监控
  • C++模板
  • [特殊字符] 深入解析:Go 与 Rust 中的数组与动态集合结构
  • redis bitmap数据类型调研
  • 巴基斯坦外长:印巴停火
  • 国际足联女子世界杯再次扩军,2031年起增至48支球队
  • 习近平会见委内瑞拉总统马杜罗
  • 青年与人工智能共未来,上海创新创业青年50人论坛徐汇分论坛举办
  • “仓促、有限”,美英公布贸易协议框架,两国分别获得了什么?
  • 复旦设立新文科发展基金,校友曹国伟、王长田联合捐赠1亿助力人文学科与社会科学创新