Celery 5.2 (Dawn Chorus) 的新特性 — Python 文档

来自菜鸟教程
Celery/docs/latest/whatsnew-5.2
跳转至:导航、​搜索

Celery 5.2 (Dawn Chorus) 的新功能

作者
奥默·卡茨 (omer.drow at gmail.com)

更改历史记录

What's new 文档描述了主要版本的变化,我们还有一个 Change history 列出了错误修复版本 (0.0.x) 的变化,而旧的系列存档在 History 部分.

Celery 是一个简单、灵活、可靠的分布式编程框架,用于处理海量消息,同时为操作提供使用 Python 维护分布式系统所需的工具。

它是一个专注于实时处理的任务队列,同时也支持任务调度。

Celery 拥有庞大而多样化的用户和贡献者社区,您应该在 IRC 我们的邮件列表 上加入我们 。

笔记

在 Freenode 出现问题之后,我们像大多数项目一样将我们的 IRC 频道迁移到了 Libera Chat。 您也可以使用 Gitter 加入我们。

我们有时在那里回答问题。 我们欢迎您的加入。


要阅读有关 Celery 的更多信息,您应该阅读 介绍

虽然此版本 主要 向后兼容以前的版本,但阅读以下部分很重要,因为此版本是新的主要版本。

该版本在 CPython 3.7 & 3.8 & 3.9 上得到官方支持,在 PyPy3 上也得到支持。

目录

在升级到此版本之前,请务必阅读重要说明。


前言

笔记

此版本包含针对两个(可能是严重的)内存泄漏的修复程序。 我们鼓励我们的用户尽快升级到此版本。


5.2.0 版本是 Celery 的一个新的次要版本。

5.x 系列中的发行版以 乔恩·霍普金斯 的歌曲代号命名。 此版本的代号为 Dawn Chorus

从现在开始,我们只支持 Python 3.7 及更高版本。 我们将保持与 Python 3.7 的兼容性,直到它于 2023 年 6 月停产。

— 奥默·卡茨

长期支持政策

我们不再支持 Celery 4.x,因为我们没有这样做的资源。 如果您愿意帮助我们,欢迎所有贡献。

Celery 5.x 不是 LTS 版本。 我们将支持它直到 Celery 6.x 发布。

我们正在定义我们的长期支持政策。 观看下一个“新增功能”文档以获取更新。


贡献者墙

笔记

这堵墙是根据 git 历史自动生成的,因此遗憾的是,它不包括帮助解决更重要的事情(例如回答邮件列表问题)的人。


从 Celery 4.x 升级

第 1 步:调整您的命令行调用

Celery 5.0 引入了一个新的 CLI 实现,它不完全向后兼容。

全局选项不能再位于子命令之后。 相反,它们必须被定位为 celery 命令的一个选项,如下所示:

celery --app path.to.app worker

如果您使用我们的 Daemonization 指南在生产中部署 Celery,您应该重新访问它以获取更新。


第 2 步:使用新的设置名称更新您的配置

如果您在迁移到 Celery 4.0 时尚未更新配置,请立即更新。

我们选择将弃用期延长至 6.0,因为我们没有大声警告使用这些弃用的设置。

有关说明,请参阅 迁移指南


第 3 步:阅读本文档中的重要说明

确保您不受 以下部分 中提到的任何重要升级说明的影响。

您应该确认 CLI 中的所有重大更改都不会影响您。 详情请参考新命令行界面


第 4 步:将代码迁移到 Python 3

Celery 5.x 仅支持 Python 3。 因此,您必须确保您的代码与 Python 3 兼容。

如果您尚未将代码移植到 Python 3,则必须在升级之前进行。

您可以使用 2to3pyupgrade 等工具来帮助您完成这项工作。

迁移完成后,使用 Celery 4 运行您的测试套件以确保没有任何损坏。


第 5 步:升级到 Celery 5.2

此时,您可以使用新版本升级您的工作人员和客户端。


重要笔记

支持的 Python 版本

支持的 Python 版本是:

  • CPython 3.7
  • CPython 3.8
  • CPython 3.9
  • PyPy3.7 7.3 (pypy3)

实验支持

Celery 暂时支持这些 Python 版本,因为它们还没有准备好生产:

  • CPython 3.10(目前在 RC2 中)


内存泄漏修复

此版本中修复了两个严重的内存泄漏:

  • celery.result.ResultSet 不再持有对自身的循环引用。
  • 当主进程与代理断开连接时,预分叉池不再永远将消息保存在其缓存中。

当您使用 celery.result.ResultSet 时,会发生第一次内存泄漏。 每个实例都持有一个承诺,该承诺提供该实例作为承诺可调用的参数。 这导致了循环引用,由于 GC 无法驱逐它,因此将 ResultSet 实例永远保留在内存中。 提供的参数现在是 ResultSet 实例的 weakref.proxy()。 内存泄漏主要发生在您使用 celery.result.GroupResult 时,因为它继承自 celery.result.ResultSet,它并不经常使用。

第二次内存泄漏自项目启动以来就存在。 prefork 池维护它执行的作业的缓存。 当它们完成时,它们从缓存中被逐出。 然而,当 Celery 与 broker 断开连接时,我们刷新池并丢弃作业,期望一旦工作人员确认它们会在稍后被清除,但事实并非如此。 相反,这些工作永远留在记忆中。 我们现在在刷新时立即丢弃这些作业。


不再支持 Python 3.6

Celery 现在需要 Python 3.7 及更高版本。

Python 3.6 将于 2021 年 12 月到达 EOL。 为了集中精力,我们在此版本中放弃了对 Python 3.6 的支持。

如果您仍然需要使用 Python 3.6 运行 Celery,您仍然可以使用 Celery 5.1。 但是,我们鼓励您升级到受支持的 Python 版本,因为在 2021 年 12 月 23 日之后将不再为 Python 3.6 应用任何安全补丁。


任务

当用另一个任务替换一个任务时,我们现在通过 replaced_task_nesting 标头给出替换嵌套级别的指示。

从未被替换的任务的 replaced_task_nesting 值为 0。


昆布

从 v5.2 开始,所需的最低版本是 Kombu 5.2.0。


Prefork 工人池

现在,当主进程退出时,所有孤立的工作进程都会自动终止。


Eventlet 工作池

您现在可以在使用 Eventlet 工作池时终止运行已撤销的任务。


自定义任务类

我们引入了一个自定义处理程序,它将在任务启动之前执行,称为 before_start

有关更多详细信息,请参阅 应用程序范围的使用


来自 5.0 的重要说明

不再支持 Python 2.7 和 3.5

Celery 现在需要 Python 3.6 及更高版本。

Python 2.7 已于 2020 年 1 月停产。 为了集中精力,我们在此版本中放弃了对 Python 2.7 的支持。

此外,Python 3.5 已于 2020 年 9 月到达 EOL。 因此,我们也将放弃对 Python 3.5 的支持。

如果您仍然需要使用 Python 2.7 或 Python 3.5 运行 Celery,您仍然可以使用 Celery 4.x。 但是,我们鼓励您升级到受支持的 Python 版本,因为不会为 Python 2.7 或 Python 3.5 应用进一步的安全补丁。


Eventlet 工作池

由于 eventlet/eventlet#526,所需的最低版本是 eventlet 0.26.1。


Gevent 工人池

从 v5.0 开始,最低要求的版本是 gevent 1.0.0。


Couchbase 结果后端

Couchbase 结果后端现在使用 V3 Couchbase SDK。

因此,我们不再支持 Couchbase Server 5.x。

此外,从 v5.0 开始,数据库客户端所需的最低版本为 couchbase 3.0.0。

要验证您的 Couchbase 服务器是否与 V3 SDK 兼容,请参阅他们的 文档


Riak 结果后端

由于不再维护数据库,Riak 结果后端已被删除。

Python 客户端仅支持 Python 3.6 及以下版本,这使我们无法支持它,而且它也没有维护。

如果您仍在使用 Riak,请不要在将应用程序迁移到其他数据库时升级到 Celery 5.0。

对于没有提前通知,我们深表歉意,但我们认为您受到此重大更改影响的可能性很小,这就是我们这样做的原因。


AMQP 结果后端

AMQP 结果后端已被删除,因为它在 4.0 版中已被弃用。


删除了不推荐使用的模块

celery.utils.encoding 和 celery.task 模块在 4.0 版本中已被弃用,因此在 5.0 中被删除。

如果你之前使用过 celery.utils.encoding 模块,你应该导入 kombu.utils.encoding 。

如果你之前使用过 celery.task 模块,你应该直接从 celery 模块导入。


azure-servicebus 现在需要 7.0.0

鉴于 SDK 在 0.50.0 和 7.0.0 之间的变化,Kombu 弃用了对旧 azure-servicebus 版本的支持。

错误:Pymongo 3.12.1 与 Celery 5.2 不兼容

目前我们限制了 Pymongo 版本,只允许 3.3.0 和 3.12.0 之间的版本。

这将在下一个补丁中修复。


消息

支持调用未注册任务的和弦

以前,如果您在提供未在 Celery 应用程序中注册的签名的同时尝试发布和弦,将和弦作为和弦的主体发布,则会引发 celery.exceptions.NotRegistered 异常。

从现在开始,您可以发布这些类型的和弦,它们将被正确执行:

# movies.task.publish_movie is registered in the current app
movie_task = celery_app.signature('movies.task.publish_movie', task_id=str(uuid.uuid4()), immutable=True)
# news.task.publish_news is *not* registered in the current app
news_task = celery_app.signature('news.task.publish_news', task_id=str(uuid.uuid4()), immutable=True)

my_chord = chain(movie_task,
                 group(movie_task.set(task_id=str(uuid.uuid4())),
                       movie_task.set(task_id=str(uuid.uuid4()))),
                 news_task)
my_chord.apply_async()  # <-- No longer raises an exception

领事结果后端

我们现在为每个对 Consul 的请求创建一个新客户端,以避免 Consul 客户端中的错误。

Consul 结果后端现在接受新的 :setting:`result_backend_transport_options` 键:one_client。 您可以通过将 one_client 设置为 True 来选择退出此行为。

如果您使用的是 Consul 后端,请参阅后端的文档以找出适合您的行为。


文件系统结果后端

我们现在清理过期的任务结果,同时像大多数结果后端一样使用文件系统结果后端。


ArangoDB 结果后端

您现在可以在与 ArangoDB 结果后端建立 TLS 连接时检查 CA 证书的有效性。

如果您愿意,请将 :setting:`arangodb_backend_settings`` 字典中的 verify 键设置为 True