
Celery 5.1 系列版本变更详解从 5.1.0b1 到 5.1.2 的关键修复与新特性【免费下载链接】celeryDistributed Task Queue (development branch)项目地址: https://gitcode.com/gh_mirrors/ce/celery导读本文基于 Celery 官方变更日志 changelog-5.1.rst系统梳理 5.1.x 系列2021 年 4 月至 6 月从 beta 到正式版的所有修复与新特性。全文以版本迭代为骨架逐个版本拆解和弦chorderrback 修复、--poolthreads命令行解析、连接丢失后任务终止策略、任务去重deduplication、Redis 用户名认证等核心变更并结合当前仓库源码验证其实现位置与行为帮助你在升级 Celery 5.1 时准确评估影响面、规避已知回归。Celery 5.1 是继 5.0 大版本 CLI 重构之后的首个功能迭代版本代号 Sun Harmonics最低要求 Kombu 5.1.0、Billiard 3.6.4正式支持 Python 3.9。本系列共包含 6 个发布两个 beta5.1.0b1、5.1.0b2、一个 RC5.1.0rc1、正式版 5.1.0以及两个补丁版 5.1.1、5.1.2。若需了解 5.1 大版本的整体设计脉络可参阅 whatsnew-5.1.rst。5.1.0b1奠定 5.1 功能基石的第一个 Beta发布于 2021-04-02由 Asif Saif Uddin 发布。这是 5.1 系列功能增量最大的一个版本绝大多数新能力都汇聚于此。新配置项与后端能力store_eager_result设置允许 eager 任务本地同步执行的任务把结果持久化到 result backend。此前task_always_eagerTrue时任务结果只保存在内存中无法通过AsyncResult跨进程查询。该设置在 celery/app/defaults.py 中默认值为False对应任务级别的task_store_eager_result别名定义于 celery/app/task.py。从源码看其生效逻辑位于 celery/app/trace.pyeager and not ignore_result and task.store_eager_result决定是否发布结果同时 celery/backends/base.py 中会检测开启task_always_eager却未开启task_store_eager_result的组合并给出告警提示结果将不会被持久化。worker_cancel_long_running_tasks_on_connection_loss设置当 broker 连接丢失时终止那些使用延迟确认late acknowledgement即acks_lateTrue且尚未确认的长任务。背景是这类任务在连接断开后仍继续运行却再也无法回执导致重启后结果丢失或重复。其实现位于 celery/worker/consumer/consumer.py连接出错后遍历active_requests对request.task.acks_late and not request.acknowledged的任务调用request.cancel(self.pool)终止未开启该配置时则发出CPendingDeprecationWarning提示未来版本将默认取消这些任务。Redis 结果后端新增health_check_intervalcelery/app/defaults.py 中对应redis_backend_health_check_interval与Redis Sentinel SSL 支持并支持通过 URI 携带用户名进行认证。AzureBlockBlob 后端升级改用 Azure blob storage 库 v12并新增azureblockblob_base_path配置#6669。执行语义与任务行为改进regen 不再贪婪Makes regen less greedy#6589优化结果集迭代的内存占用改用单次 lookahead 消费模式后续在 5.1.1 中进一步完善为Use single-lookahead for regen consumption#6799。和弦头部任务尽快启动#6576Start chord header tasks as soon as possible缩短 chord 整体等待时间。任务支持任意顺序的必需关键字参数#6699形如def my_func(*, namedefault, age, cityKyiv)的签名现在可以被正确解析见 whatsnew-5.1.rst。--quiet标志真正生效#6599此前该参数无法阻止日志输出。失败时以非零退出码退出#6602确保 CI 脚本能感知 Celery 命令失败。trace_task_ret与fast_trace_task转为公开 APIreset_worker_optimizations与create_request_cls的app参数变为可选。Redis 后端存储值过大时抛出BackendStoreError。重试任务转发shadow选项#6655使重试后任务名遮蔽行为保持一致。依赖与兼容性最低依赖提升Kombu 5.1.0b1、py-amqp 5.0.6、billiard 3.6.4.0。改用社区维护的 python-consul2 库#6544。删除lzmaextra 与fun_accepts_kwargs兼容层。新增 Python 3.9 的初步支持CI 迁移至 GitHub Actions并更新部署脚本与 Docker 配置。5.1.0b2面向稳定性与结果持久化的第二轮修正发布于 2021-05-02由 Omer Katz 发布重点修复 5.0 引入的回归。修复 5.0 中 json 序列化行为回归#6561确保 JSON 编码/解码结果与文档一致。支持 SQLAlchemy 1.4#6709适配 declarative base 不再作为扩展导入的变化。task.apply_async(ignore_resultTrue)现在真正避免持久化结果#6713语义与app.task(ignore_resultTrue)完全一致从 celery/app/trace.py 可看到ignore_result会同时压制track_started与publish_result从而不写后端。chord 子任务计数更精确#6733修复了 group 内子任务完成数统计偏差。task-revoked事件与task_revoked信号不再重复触发当Request.on_failure被调用时#6654 的一部分。恢复Retry对象的 pickle 支持#6748保证跨进程传递重试信息。Redis 结果后端支持用户名认证#6750适配 Redis 6.0 的 ACL 能力。worker_pool设置被正确尊重#6711修复此前命令行覆盖配置的行为偏差。inspect 命令重新支持参数#6710、AMQPContext暴露app属性#6741、systemd tmpfiles 路径更新#6688、以及无 kwargs 的调度条目防御#6619。5.1.0rc1发布前的收尾修补发布于 2021-05-02由 Omer Katz 发布进入 RC 阶段后的变更集中在集成正确性group 类签名group-like signatures的错误传播与 errback 调用恢复正常#6746此前 group 出错时 errback 不会被正确分发。Celery Mailbox 的accept与serializer参数从配置初始化#6757使 worker 间的 pidbox 通信协议可配置。修复 sentinel URI 中密码的脱敏处理#6765避免日志泄露密码。新增LOG_RECEIVED日志级别以定制日志输出#6758可单独控制任务接收日志的开关与格式。5.1.0 正式版核心依赖门槛确立发布于 2021-05-23由 Omer Katz 发布。正式版本身改动收敛主要确认两件事celery -A app events -c camera按预期工作#6774事件流配合自定义 camera快照处理器的命令行组合在 5.0 新 CLI 下回归正常。最低 Kombu 版本提升至 5.1.0正式确立与 5.1 系列的兼容基线。5.1.1修复 5.1.0 的回归与边缘问题发布于 2021-06-17由 Omer Katz 发布。这是 5.1 系列最重要的补丁版修复了多个由 5.1.0 引入的回归修复--poolthreads命令行解析#6787新 CLI 的选项解析此前无法正确处理该池类型这是升级 5.1.0 后最易踩中的坑之一。修复LoggingProxy.write()返回类型#6791保证写入日志时返回正确的字符数符合文件对象协议。CouchDB 的 key 统一强制转为字符串#6781避免因 key 类型不一致导致的查询异常。grp不再无条件导入#6804修复 5.1.0 在非 Unix 系统如 Windows上运行时的崩溃。regen 工具类被具体化concatenated时标记为完成#6789修复结果迭代器提前结束或挂起的边界问题。保留被替换任务的 callbacks/errbacks#6770当任务通过replace被替换时原先挂载的回调不再丢失。regen 消费改为单 lookahead#6799进一步降低结果集迭代的内存峰值。被撤销revoked的任务不再被错误标记为已重试#6812、#6816修复结果状态被污染的问题。5.1.2chord 失败路径的最终修复发布于 2021-06-28由 Omer Katz 发布是 5.1 系列的收尾版本chord 失败时正确调用 errbacks#6814此前 chord 失败调用 errback 时存在一个特判假设 errback 都是旧风格old style。该版本改用统一的分发方法同时识别新/旧两种风格 errback并补充测试确认行为符合预期。这是对 5.1.0rc1 中 group errback 修复#6746的深化。避免使用Event.isSet()弃用别名#6824改用is_set()消除弃用告警。恢复Celery.start()默认使用sys.argv的行为#6825在 celery/app/base.py 中start(argvNone)时argv sys.argv随后调用celery.main(argsargv, standalone_modeFalse)。5.0 新 CLI 曾改变该默认行为5.1.2 将其还原确保app.start()这类编程式入口的兼容性。5.1 系列核心变更的源码落点一览变更点源码位置仓库相对路径行为说明store_eager_result配置celery/app/defaults.py、celery/app/task.py、celery/app/trace.pyeager 任务按需持久化结果到后端worker_deduplicate_successful_tasks去重celery/app/trace.py、celery/app/trace.py延迟确认 持久化后端时重投递的成功任务直接跳过执行并补发回调worker_cancel_long_running_tasks_on_connection_loss终止长任务celery/worker/consumer/consumer.py连接丢失后取消未确认的acks_late任务Celery.start()恢复sys.argv默认值celery/app/base.pyargvNone时回退到sys.argv其中worker_deduplicate_successful_taskswhatsnew 文档中称为Duplicate successful tasks是 5.1 引入的防重执行机制在 celery/app/trace.py 中仅当任务使用延迟确认且后端为持久化类型时启用任务重投递后redeliveredTrue先查询后端状态若为SUCCESS则记录日志Task already completed successfully并跳过执行同时从后端元数据中读取children若回调/链尚未派发则补发从而保证 at-least-once 投递模型下回调不重复见 celery/app/trace.py。升级 5.1 的实操建议基于上述变更从 5.0 升级到 5.1.x 时建议按以下顺序核对依赖对齐将 Kombu 提升至 ≥5.1.0、py-amqp ≥5.0.6、billiard ≥3.6.4若使用 eventlet/gevent 池注意版本下限。优先使用 5.1.1 或 5.1.25.1.0 存在--poolthreads解析回归#6787与非 Unix 平台的grp导入崩溃#6804务必升级到至少 5.1.1。按需开启新配置如需 eager 任务结果持久化配置task_store_eager_resultTrue注意需同时理解 celery/backends/base.py 中关于task_always_eager的告警如使用 Redis 6.0 ACL可在连接 URI 中加入用户名如运行长任务且使用acks_late评估开启worker_cancel_long_running_tasks_on_connection_loss的影响。回归重点升级后重点验证 chord/group 的 errback 行为#6746、#6814、结果去重deduplication与ignore_resultTrue的持久化行为#6713。编程式入口若在代码中调用app.start()确认运行在 5.1.2 上以恢复sys.argv默认行为#6825。更完整的 5.1 功能背景如 SQS 退避策略、Azure Service Bus 7.0 支持、pickle 协议升级到 v4、线程安全cached_property等可继续阅读 whatsnew-5.1.rst其余历史版本的变更可浏览 docs/history 目录下的changelog-*.rst系列文档。【免费下载链接】celeryDistributed Task Queue (development branch)项目地址: https://gitcode.com/gh_mirrors/ce/celery创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考