Celery 4.3 (rhubarb) 的新特性 — Python 文档
Celery 4.3 的新特性(大黄)
- 作者
- 奥默·卡茨 (
omer.drow at gmail.com
)
更改历史记录
What's new 文档描述了主要版本的变化,我们还有一个 Change history 列出了错误修复版本 (0.0.x) 的变化,而旧的系列存档在 History 部分.
Celery 是一个简单、灵活且可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。
它是一个专注于实时处理的任务队列,同时也支持任务调度。
Celery 拥有庞大而多样化的用户和贡献者社区,您应该在 IRC 或 我们的邮件列表 上加入我们 。
要阅读有关 Celery 的更多信息,您应该阅读 介绍 。
虽然此版本向后兼容以前的版本,但阅读以下部分很重要。
此版本在 CPython 2.7、3.4、3.5、3.6 和 3.7 上得到官方支持,在 PyPy2 和 PyPy3 上也得到支持。
目录
在升级到此版本之前,请务必阅读重要说明。
前言
4.3.0 版本继续改进我们的工作,为您提供 Python 的最佳任务执行平台。
此版本的代号为 Rhubarb,这是 Selected Ambient Works II 中我最喜欢的曲目之一。
此版本侧重于新功能,例如新的结果后端和改进的安全序列化程序,以及主要针对 Celery Beat、Canvas 的错误修复,针对挂起工作人员的许多关键修复以及针对几个严重内存泄漏的修复。
Celery 4.3 是第一个支持 Python 3.7 的版本。
我们希望 4.3 将是支持 Python 2.7 的最后一个版本,因为我们现在开始开发下一代任务执行平台 Celery 5。
但是,如果 Celery 5 因任何原因推迟发布,我们可能会发布另一个仍支持 Python 2.7 的 4.x 次要版本。
如果发布另一个 4.x 版本,它很可能会放弃对 Python 3.4 的支持,因为它将在 2019 年 3 月达到 EOL。
我们还专注于减少贡献摩擦。
感谢 Josue Balandrano Coronel,我们的核心贡献者之一,我们现在有了更新的 Contributing 文档。 如果您打算做出贡献,请在您方便的时候尽早查看。
我还添加了新的问题模板,我们将继续改进,以便您打开的问题具有更多相关信息,这将使我们能够帮助您更轻松地解决它们。
— 奥默·卡茨
贡献者墙
亚历山大·约阿尼迪斯 < a.ioannidis.pan@gmail.com > 阿米尔侯赛因赛义德梅尔 < amir.saiedmehr@gmail.com > 安德里亚·拉巴列蒂 < rabbagliettiandrea@gmail.com > 安德烈·斯卡贝林 < andrey.skabelin@gmail.com > 安东尼·鲁希尔 < anthony.ruhier@gmail.com > 安东尼·德尔佩奇 < antonin@delpeuch.eu > 阿尔乔姆·瓦西里耶夫 < artem.v.vasilyev@gmail.com > 阿西夫赛义夫乌丁 (Auvi) < auvipy@gmail.com > avidatsnyk < aviad@snyk.io > 阿克塞尔·豪斯坦特 < noirbizarre@users.noreply.github.com > 本杰明·佩雷托 < github@sandchaschte.ch > 博扬·约万诺维奇 < bojan.jovanovic.gtech@gmail.com > 布雷特杰克逊 < 布雷特@brettjackson.org > 布雷特兰德尔 < javabrett@gmail.com > 布赖恩施拉德 < brian@brianschrader.com > 布鲁诺·阿拉 < browniebroke@users.noreply.github.com > 好友 < 34044521+CoffeeExpress@users.noreply.github.com > 查尔陈 < charleswhchan@users.noreply.github.com > 克里斯托弗·迪格南 < 克里斯@dignam.xyz > 夏兰考特尼 < 6096029+ciarancourtney@users.noreply.github.com > 克莱门斯沃尔夫 < clemens@justamouse.com > 科林·沃森 < cjwatson@ubuntu.com > 丹尼尔·哈勒 < github@thequod.de > 达什温特森 < dashdanw@gmail.com > 德里克·哈兰德 < donkopotamus@users.noreply.github.com > 迪利普·瓦姆西·莫图里 < 16288600+dilipvamsi@users.noreply.github.com > 德米特罗·利特维诺夫 < litvinov.dmytro.it@gmail.com > 道格拉斯罗德 < douglas.rohde2@gmail.com > 埃德莫利 < 501702+edmorley@users.noreply.github.com > 法比安贝克尔 < halfdan@xnorfz.de > 费德里科·邦德 < federicobond@gmail.com > 陈凤远 < cfy1990@gmail.com > 弗洛里安·夏尔丁 < othalla.lf@gmail.com > 乔治·普萨拉基斯 < giwrgos.psarakis@gmail.com > 吉列尔梅·卡米尼亚 < gpkc@cin.ufpe.br > 想法cf < ideacf@163.com > 意大利 < itay.bittan@gmail.com > 杰米·阿莱西奥 < jamie@stoic.net > 杰森霍尔德 < jasonsheld@gmail.com > 杰里米·科恩 < jcohen02@users.noreply.github.com > 约翰·阿诺德 < johnar@microsoft.com > 乔恩·巴纳法托 < jonathan.banafato@gmail.com > 乔恩·杜福雷< jon.dufresne@gmail.com > 约书亚·恩格尔曼 < j.aaron.engelman@gmail.com > 约书亚施密德 < jschmid@suse.com > Josue Balandrano Coronel < xirdneh@gmail.com > K 戴维斯 < anyones@users.noreply.github.com > 孩子们 < ckidoz@gmail.com > 山口清弘 < kiyoya@gmail.com > 科里恩·范·戈伦 < korijn@gmail.com > 拉斯·克鲁斯 < devel@sumpfralle.de > 拉斯·林恩 < lm.rinn@outlook.com > 刘易斯 M. 歌舞井 < lewis.maina@andela.com > 疯狂的程序员 < serg@anufrienko.net > 曼努埃尔·巴斯克斯·阿科斯塔 < mvaled@users.noreply.github.com > 马库斯麦克海尔 < marcus.mchale@nuigalway.ie > 玛丽亚塔 < Mariatta@users.noreply.github.com > 马里奥·科斯特拉克 < mario@intercom.io > 马特·维恩斯 < mwiens91@gmail.com > 马克西米连·库尼 < the-glu@users.noreply.github.com > 马克西米连·德·贝瑟 < maxdebayser@gmail.com > 梅萨姆 < MeysamAzad81@yahoo.com > 密林释迦 < milin@users.noreply.github.com > na387 < na387@users.noreply.github.com > 尼古拉斯·皮隆 < npilon@gmail.com > 尼克帕森斯 < nparsons08@gmail.com > 尼克莫尔纳 < nik.molnar@consbio.org > 诺亚厅 < noah.t.hall@gmail.com > 诺姆 < noamkush@users.noreply.github.com > 奥马尔·卡茨 < omer.drow@gmail.com > Paweł Adamczak < pawel.ad@gmail.com > 彭伟康 < pengwk2@gmail.com > 普拉塔梅什·萨伦赫 < spratham55@gmail.com > 普热米斯瓦夫·苏利加 < 1270737+suligap@users.noreply.github.com > 拉夫·吉恩斯 < rafgeens@gmail.com > (◕ᴥ◕) < ratson@users.noreply.github.com > 罗伯特·科帕切夫斯基 < rk@23doors.com > Samuel Huang < samhuang91@gmail.com > 塞巴斯蒂安·沃伊切霍夫斯基 < 42519683+sebwoj@users.noreply.github.com > 李承勋 < waydi1@gmail.com > 沙纳瓦斯 M < shanavas.m2@gmail.com > 西蒙查雷特 < charettes@users.noreply.github.com > 西蒙·施密特 < schmidt.simon@gmail.com > srafehi < shadyrafehi@gmail.com > 史蒂文斯克拉 < sklarsa@gmail.com > 汤姆布斯 < thomasbo@microsoft.com > 汤姆克兰西 < ClancyTJD@users.noreply.github.com > 托妮·鲁扎 < gmr.gaf@gmail.com > tothegump < tothegump@gmail.com > 维克多·米列耶夫 < victor@opennodecloud.com > 维卡斯·普拉萨德 < vikasprasad.prasad@gmail.com > 沃尔特钱 < walter@color.com > 威廉 < 他自己@willemthiart.com > 晓东 < xd_deng@hotmail.com > yywing < 386542536@qq.com >
笔记
这堵墙是根据 git 历史自动生成的,因此遗憾的是,它不包括帮助解决更重要的事情(例如回答邮件列表问题)的人。
从 Celery 4.2 升级
请阅读下面的重要说明,因为有几个重大变化。
重要说明
支持的 Python 版本
支持的 Python 版本是:
- CPython 2.7
- CPython 3.4
- CPython 3.5
- CPython 3.6
- CPython 3.7
- PyPy2.7 6.0 (
pypy2
) - PyPy3.5 6.0 (
pypy3
)
昆布
从此版本开始,所需的最低版本为 Kombu 4.4。
新的压缩算法
Kombu 4.3 包括一些新的可选压缩方法:
- LZMA(如果使用 Python 3 或从后向移植包,则可从 stdlib 获得)
- Brotli(如果您安装了 brotli 或 brotlipy 包,则可用)
- ZStandard(如果您安装了 zstandard 包,则可用)
不幸的是,我们当前的协议为复杂的画布生成了巨大的有效载荷。
在我们迁移到 Celery 5 中的 Celery 协议的第 3 版以解决此问题之前,请使用一种新的压缩方法作为解决方法。
有关详细信息,请参阅 压缩 。
台球
从此版本开始,所需的最低版本为台球 3.6。
Eventlet 工作池
我们现在需要 eventlet>=0.24.1。
如果您正在使用 eventlet 工作池,请使用以下命令安装 Celery:
$ pip install -U celery[eventlet]
消息包序列化程序
我们一直在使用过时的 msgpack-python 包。 现在已修复,因为我们依赖于 msgpack。
如果您当前正在使用 MessagePack 序列化程序,请卸载以前的软件包并使用以下方法重新安装新软件包:
$ pip uninstall msgpack-python -y
$ pip install -U celery[msgpack]
MongoDB 结果后端
我们现在支持 MongoDB 结果后端的 DNS 种子列表连接格式 。
这需要 dnspython 包。
如果您使用的是 MongoDB 结果后端,请使用以下命令安装 Celery:
$ pip install -U celery[mongodb]
Redis 消息代理
由于 py-redis 早期版本中的多个错误导致 Celery 出现问题,我们被迫将所需的最低版本提高到 3.2.0。
Redis 结果后端
由于 py-redis 早期版本中的多个错误导致 Celery 出现问题,我们被迫将所需的最低版本提高到 3.2.0。
Riak 结果后端
官方 Riak 客户端目前还不支持 Python 3.7。
如果您使用 Riak 结果后端,请尝试从 master 安装客户端或避免升级到 Python 3.7,直到问题得到解决。
如果您在 Python 3.7 中使用 Riak 结果后端,我们现在会发出警告。
请跟踪 basho/riak-python-client#534 以获取更新。
不再支持 RabbitMQ 2.x
从这个版本开始,我们正式不再支持 RabbitMQ 2.x。
2.x 的最后一个版本是在 2012 年,我们必须做出调整以正确支持 RabbitMQ 3.x 的高可用性。
如果出于某种原因,您仍在使用 RabbitMQ 2.x,我们鼓励您尽快升级,因为 RabbitMQ 2.x 上不再应用安全补丁。
Django 支持
从此版本开始,所需的最低 Django 版本为 1.11。
改进的身份验证序列化程序
auth 序列化程序进行了全面检修。 它以前被严重破坏。
我们现在依赖 cryptography 而不是 pyOpenSSL 这个序列化器。
有关详细信息,请参阅 消息签名 。
新闻
经纪人
Redis 代理对 SSL URI 的支持
Redis 代理现在支持 SSL 连接。
您可以像往常一样使用 :setting:`broker_use_ssl` 并使用 rediss:// URI。
您还可以将 SSL 配置参数传递给 URI:
rediss://localhost:3456?ssl_keyfile=keyfile.key&ssl_certfile=certificate.crt&ssl_ca_certs=ca.pem&ssl_cert_reqs=CERT_REQUIRED
结果后端
Redis 结果后端支持 SSL URI
Redis 结果后端现在支持 SSL 连接。
您可以使用 :setting:`redis_backend_use_ssl` 对其进行配置并使用 rediss:// URI。
您还可以将 SSL 配置参数传递给 URI:
rediss://localhost:3456?ssl_keyfile=keyfile.key&ssl_certfile=certificate.crt&ssl_ca_certs=ca.pem&ssl_cert_reqs=CERT_REQUIRED
在结果中存储扩展任务元数据
当 :setting:`result_extended` 为 True 时,后端将存储以下元数据:
- 任务名称
- 参数
- 关键字参数
- 执行任务的工人
- 重试次数
- 队列的名称或路由键
此外,celery.app.task.update_state()
现在接受关键字参数,允许您将自定义数据与结果一起存储。
使用不同的序列化程序对结果进行编码
:setting:`result_accept_content` 设置允许为结果后端配置不同的接受内容。
一个特殊的序列化程序 (auth) 用于签名消息,但是 result_serializer 保留在 json 中,因为我们不想在我们的结果后端中加密内容。
为了接受来自结果后端的未签名内容,我们引入了这个新的配置选项来指定来自后端的接受内容。
新的结果后端
此版本引入了四个新的结果后端:
- S3 结果后端
- ArangoDB 结果后端
- Azure 块 Blob 存储结果后端
- CosmosDB 结果后端
S3 结果后端
Amazon Simple Storage Service (Amazon S3) 是 AWS 提供的对象存储服务。
结果使用以下路径模板存储:
< :设置:`s3_bucket` >/< :设置:`s3_base_path` >>/
有关详细信息,请参阅 S3 后端设置 。
ArangoDB 结果后端
ArangoDB 是一个具有搜索功能的原生多模型数据库。 后端以以下文档格式存储结果:
{
_key: {key},
task: {task}
}
有关更多信息,请参阅 ArangoDB 后端设置 。
Azure 块 Blob 存储结果后端
Azure 块 Blob 存储是 Microsoft 的对象存储服务。
后端将结果存储在以下路径模板中:
有关详细信息,请参阅 Azure Block Blob 后端设置 。
CosmosDB 结果后端
Azure Cosmos DB 是 Microsoft 的全球分布式多模型数据库服务。
后端以以下文档格式存储结果:
{
id: {key},
value: {task}
}
有关更多信息,请参阅 CosmosDB 后端设置(实验)。
任务
Cythonized 任务
现在支持 Cythonized 任务。 您可以从 Cython 生成使用 @task 装饰器指定任务的 C 代码,一切都应该完全相同。
确认任务失败或超时
当 :setting:`task_acks_late` 设置为 True 任务在失败或超时时被确认。 这使得很难使用死信队列和交换。
Celery 4.3 引入了新的 :setting:`task_acks_on_failure_or_timeout`,它允许您避免在任务失败或超时时确认任务,即使 :setting:`task_acks_late` 设置为 真。
:setting:`task_acks_on_failure_or_timeout` 默认设置为 True。
计划现在支持微秒
使用 celery beat 微秒调度任务时不再被忽略。
任务可以选择继承父级的优先级
将 :setting:`task_inherit_parent_priority` 配置选项设置为 True 将使 Celery 任务继承与其链接的前一个任务的优先级。
例子:
c = celery.chain(
add.s(2), # priority=None
add.s(3).set(priority=5), # priority=5
add.s(4), # priority=5
add.s(5).set(priority=3), # priority=3
add.s(6), # priority=3
)
@app.task(bind=True)
def child_task(self):
pass
@app.task(bind=True)
def parent_task(self):
child_task.delay()
# child_task will also have priority=5
parent_task.apply_async(args=[], priority=5)
帆布
可配置的和弦加入超时
以前,celery.result.GroupResult.join()
的固定超时为 3 秒。
:setting:`result_chord_join_timeout` 设置现在允许您更改它。
默认值保持为 3 秒。