Celery 5.2 (Dawn Chorus) 的新特性 — Python 文档
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,因为我们没有大声警告使用这些弃用的设置。
有关说明,请参阅 迁移指南 。
第 4 步:将代码迁移到 Python 3
Celery 5.x 仅支持 Python 3。 因此,您必须确保您的代码与 Python 3 兼容。
如果您尚未将代码移植到 Python 3,则必须在升级之前进行。
您可以使用 2to3 和 pyupgrade 等工具来帮助您完成这项工作。
迁移完成后,使用 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 工作池时终止运行已撤销的任务。
来自 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 应用进一步的安全补丁。
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
。