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

news/2025/10/5 12:12:34/文章来源:https://www.cnblogs.com/ljbguanli/p/19126453

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.mzph.cn/news/928235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用指南:Appium如何支持ios真机测试

实用指南:Appium如何支持ios真机测试pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名计算机控制AI框架需求洞察

本文基于某知名计算机控制AI框架的文档和用户反馈,深入分析其核心功能特性和使用方式,并挖掘出用户提出的关键新需求,为产品迭代提供重要参考方向。a.内容描述核心功能定位:该项目是一个开源的智能GUI代理框架,旨…

无人机桥梁3D建模、巡检、检测的航线规划 - 详解

无人机桥梁3D建模、巡检、检测的航线规划 - 详解2025-10-05 12:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

低代码——表单生成器Form Generator详解(二)——从JSON配备项到动态渲染表单渲染

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Codeforces Round 1040 (Div. 1)

VP Codeforces Round 1040 (Div. 1),从中间开始做,一道都没有写完。我发现做 CF 上的题目(特别是前面的题)一定不要想的太深,要快速切换多种思路考虑A. Double Perspective 题解 skip 完整代码点击查看代码 #incl…

如何生成网站的二维码wordpress get_attached_media

1.MTE概念 MTE(内存标记扩展)是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中,类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂,不适用于广泛部署(仅调试使用)。MTE当前…

实用指南:1039 Course List for Student

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

邢台wap网站建设开发html网页的软件有哪些

对泛型的一个自我理解 泛型的使用&#xff0c;实际上就像一个占位符一样&#xff0c; 我先预定义一个类型&#xff0c;这个类型具体是啥只有在真正使用的时候才知道。从某种角度来看&#xff0c;泛型很像这个 any 类型啊。泛型的定义语法 泛型的定义使用 <T> 的方式来定…

2025十一集训——Day3做题

A vjudge CF题意:一个图,选择一个回答,\(k/2\) 的独立集或者不大于 \(k\) 的环。考虑 \(k=n\) 如果是树直接黑白染色,否则必有环。 然后考虑出题人:“保证有解”,所以直接去一个 \(k\) 的联通块,按照 \(k=n\) 正…

国外服务器做视频网站做网站做软件怎么赚钱

题目大意是&#xff1a; 从n*n的方格角落的一个起点出发&#xff0c;每次移到上下左右一个未曾到达过的位置&#xff0c;谁不能走了谁就输了 想了好久都想不出&#xff0c;看了大神的题解 Orz了 果然博弈不是脑残的游戏啊... 这里从起点出发&#xff0c;将所有方格两两连接&…

目标检测任务的评估指标P-R曲线 - 指南

目标检测任务的评估指标P-R曲线 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

abc426 题解

abc426 题解 abc426 赛时 ABCD,E 被卡精度卡了30min,21:41 改为 long double 过了 /ll A 水题,懒得写 B 同上 C 拿树状数组硬跑,每次记录当前的 \(x\) 的最大值(即当前序列最大值) for(int i = 1; i <= n; i…

运行npp并打开实时双向同步的今日日记纯文本文档 2025年10月5日

运行npp并打开实时双向同步的今日日记纯文本文档 2025年10月5日; 运行npp并打开实时双向同步的今日日记纯文本文档 ; 文件名:D:\APP\npp\npp-ahk.ahk ; 运行环境:AutoHotkey v1.1.37.02 ,Microsoft Windows 10 版本…

石家庄网站建设云图大连网站程序开发

import collections import re from d2l import torch as d2l解析文本的常见预处理步骤&#xff1a; 将文本作为字符串加载到内存中。 将字符串拆分为词元&#xff08;如单词和字符&#xff09;。 建立一个词表&#xff0c;将拆分的词元映射到数字索引。 将文本转换为数字索…

完整教程:python学习打卡day43

完整教程:python学习打卡day43pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

微信公众平台开发微网站wordpress爆破密码字典

在Python中&#xff0c;直接根据网页内容导出为PDF或XLSX格式通常涉及几个步骤。首先&#xff0c;你需要抓取网页内容&#xff0c;然后将其解析成适合导出到PDF或XLSX的结构。下面是一些示例代码&#xff0c;展示如何完成这些任务。 网页内容抓取 你可以使用requests库来抓取…

做兼职什么网站比较好广东东莞房价

RCA接口&#xff08;消费类市场&#xff09; RCA 是Radio Corporation of American的缩写词&#xff0c;因为RCA接头由这家公司发明的。RCA俗称莲花插座&#xff0c;又叫AV端子&#xff0c;也称AV 接口&#xff0c;几乎所有的电视机、影碟机类产品都有这个接口。它并不是专门为…

mac 下修改本机hosts

系统版本macOS Sonoma 14.2由于mac 系统安全限制,/etc/hosts文件不能被修改,导致加速github等写入hosts文件不能写入加速,通过网上很多方法尝试不能进行处理该问题,目前已经处理特此记录 1、打开访达文件夹command…

Asp.Net Core SignalR的协议协商挑战

Asp.Net Core SignalR的协议协商挑战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

湖南省交通建设质量安全监督管理局网站西安电商网站

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 以三个点的当前位置作为状态&#xff0c;广度优先遍历&#xff0c;找到终点即为最短次数。 注意&#xff1a; 一次可以移动多个点&#xff0c;但是每个点只能移动一步。在同一次中&#xf…