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

python中使用高并发分布式队列库celery的那些坑 - 指南

python中使用高并发分布式队列库celery的那些坑 - 指南

Celery 是一个用于 分布式任务队列 的 Python 库,常用于处理异步任务(即任务不需要立即执行,后台慢慢做),尤其适合执行定时任务或耗时操作。


? 简单理解

Celery 就是让你把“任务”扔到后台执行,而不是阻塞当前程序。


?️ 核心功能

功能说明
异步任务执行比如发邮件、处理图片、生成报告等不需要立即完成的操作。
分布式任务调度可以运行在多台服务器上,实现任务负载均衡。
定时任务(周期任务)类似 crontab,可设置任务定时执行(如每天 8 点发日报)。
任务重试机制失败任务可以自动重试,适用于网络波动等场景。
与Django/Flask集成非常适合与这些 Web 框架配合使用,将长耗时任务下放到 Celery。

? 工作机制

Celery 一般由以下几部分组成:

  1. Producer(生产者):你写的代码,会将任务“发”出去。
  2. Broker(中间人):任务先存放在消息队列(如 Redis、RabbitMQ)中。
  3. Worker(工人):后台运行的进程,专门“接收”和“执行”这些任务。
  4. Result Backend(结果后端):可选,记录任务结果,如执行成功或失败。

? 示例代码(使用 Redis 作为 broker)

# tasks.py
from celery import Celery
app = Celery('mytasks'
, broker='redis://localhost:6379/0'
)
@app.task
def add(x, y):
return x + y

运行方式:

celery -A tasks worker --loglevel=info

调用方式(异步执行):

add.delay(3
, 5
) # 返回一个异步结果对象

? 常见搭配


如果你正在开发一个 需要做“异步处理”或“后台任务”的系统,Celery 是 Python 中的主流选择之一。但是该库看似简单,却隐藏着无数坑,本文就带大家了解一下我在使用过程中遇到的那些坑。

? 我的环境

?第一个问题

执行命令:

celery -A main_async:celery_app worker --loglevel=info

报错:

[2025-05-29 19:40:22,107: INFO/MainProcess] Task main_async.background_content_similarity[4c84e1c8-6a13-4241-8e62-04e17b3884cb] received
[2025-05-29 19:40:22,142: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)'
)
billiard.einfo.RemoteTraceback:
"""
Traceback (most recent call last):
File "D:\ProgramData\Anaconda3\envs\gj_ai_new\Lib\site-packages\billiard\pool.py", line 362,
in workloop
result = (True, prepare_result(fun(*args, **kwargs))
)
^^^^^^^^^^^^^^^^^^^^
File "D:\ProgramData\Anaconda3\envs\gj_ai_new\Lib\site-packages\celery\app\trace.py", line 640,
in fast_trace_task
tasks, accept, hostname = _loc
^^^^^^^^^^^^^^^^^^^^^^^
ValueError: not enough values to unpack (expected 3, got 0
)
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "D:\ProgramData\Anaconda3\envs\gj_ai_new\Lib\site-packages\billiard\pool.py", line 362,
in workloop
result = (True, prepare_result(fun(*args, **kwargs))
)
^^^^^^^^^^^^^^^^^^^^
File "D:\ProgramData\Anaconda3\envs\gj_ai_new\Lib\site-packages\celery\app\trace.py", line 640,
in fast_trace_task
tasks, accept, hostname = _loc
^^^^^^^^^^^^^^^^^^^^^^^
ValueError: not enough values to unpack (expected 3, got 0
)

该问题是由于celery的默认并发网络编程线程库引起的,换成eventlet可以解决问题,只需修改启动命令即可,如下:

celery -A main_async:celery_app worker --loglevel=info -P eventlet

?第二个问题

第二个问题是日志问题,报错类似如下所示:

'LoggingProxy' object has no attribute 'encoding'"
原因分析

Celery 在启动 worker 时,默认会将标准输出和标准错误重定向到其日志系统中。这意味着 sys.stdout 和 sys.stderr 被替换为 LoggingProxy 对象。然而,某些库或代码可能期望这些对象具有标准文件对象的属性,如 encoding 或 fileno,从而导致 AttributeError。

此时只需要将worker_redirect_stdouts参数设置为False即可解决问题,代码如下:

# Celery 配置
celery_app.conf.update(
task_serializer="json"
,
accept_content=["json"]
,
result_serializer="json"
,
timezone="Asia/Shanghai"
,
enable_utc=True
,
include=["main_async"]
, # 显式指定任务模块
task_track_started=True
, # 跟踪任务开始状态
task_ignore_result=False
, # 保存任务结果
task_store_errors_even_if_ignored=True
, # 存储错误
worker_redirect_stdouts = False # 禁止将stdout和stderr重定向到当前记录器。
)
http://www.zskr.cn/news/16097.html

相关文章:

  • 在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名计算机控制AI框架需求洞察
  • 无人机桥梁3D建模、巡检、检测的航线规划 - 详解
  • mac 下修改本机hosts
  • 【光照】Unity如何在Cubemap中采样反射信息?
  • 深入解析:[论文阅读]Poisonprompt: Backdoor attack on prompt-based large language models
  • 箭头
  • 2025广告喷绘公司最新推荐榜单, 覆盖广告喷绘广告牌,广告喷绘写真,广告喷绘广告牌写真,广告喷绘门头服务!
  • 实用指南:24.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--认证微服务
  • 详细介绍:STM32 串口通信①:USART 全面理解 + 代码详解
  • 2025夹丝玻璃厂家最新企业品牌推荐排行榜,艺术夹丝玻璃,淋浴房夹丝玻璃,极简门夹丝玻璃,金属夹丝玻璃公司推荐!
  • 详细介绍:性能优化 - 案例篇:缓存_Guava#LoadingCache设计
  • 2025年X射线管厂家最新企业品牌推荐排行榜,工业用金属陶瓷,波长色散荧光分析,应力衍射分析,管板角焊缝,轮胎检测,辐照,固定阳极波纹陶瓷,测厚,食品检测 X 射线管公司推荐
  • 深入解析:Guava限频器RateLimiter的使用示例
  • Photoshop 在线网页版?是的,它来了!免费使用指南
  • 鲲鹏Arm+麒麟V10 K8s 离线部署教程 - 教程
  • 线段树模板1
  • 20多年前李敖告訴你美國為什麼不可靠?
  • 2025数控铣床厂家最新企业品牌推荐排行榜, 双头数控铣床,双面数控铣床,龙门数控铣床,双侧数控铣床推荐这十家公司!
  • 题解:2025.10.信友队.智灵班选拔面试题目
  • MX WEEK4
  • 实用指南:【25软考网工】第十章 网络规划与设计(1)综合布线
  • 深入解析:Java基础(二):八种基本数据类型详解
  • 物理_备忘
  • 详细介绍:静态资源js,css免费CDN服务比较
  • 在AI技术唾手可得的时代,挖掘JavaScript学习资源的新需求成为关键
  • 读人形机器人31未来30年
  • 【java面试】redis篇 - 指南
  • NLP学习路线图(十四):词袋模型(Bag of Words) - 详解
  • 2025 年搅拌器厂家最新推荐排行榜:涵盖立式、不锈钢、侧入式等多类型设备,深度解析实力厂商
  • 2025 年最新推荐承烧板厂家排行榜:筛选优质企业,破解采购难题,赋能高温工业生产