基于celery,异步任务的序列化器问题 ---celery 的坑

本文探讨了使用Celery处理异步任务时遇到的序列化问题,特别是在传递文件流等复杂数据类型时。介绍了Celery支持的几种序列化器,如JSON、pickle、YAML和msgpack的特点,并推荐在特定场景下使用pickle。

往往我们在用celery做异步任务时,在做初始化时默认的话,就是Json,往往Json是我们用的最普遍的方法。

但是有一个非常致命的问题,在我们创建一般的异步任务时,在我们delay调用传参时,会出一个问题,我们传的参数正常的话是可以进行Json序列化的,但是要考虑一个问题,就比如说我们在传文件流的时候,文件流是二进制的字节流,这个时候怎么办呢,使用Json序列化是不行的。所以这里要使用其他的序列化器,用什么序列化器呢?这时候就要思考了,肯定要用celery内支持的。

序列化

在客户端和工作人员之间传输的数据需要进行序列化,因此 Celery 中的每条消息都有一个 content_type 标头,该标头描述了用于对其进行编码的序列化方法。
默认的序列化器是JSON,但是您可以使用 task_serializer 设置更改此设置,或者针对每个任务,甚至针对每条消息进行更改。
有内置的支持JSON,pickle,YAML 和msgpack,你也可以通过他们登记到 Kombu 注册表中添加自己的自定义序列化
安全
pickle 模块允许执行任意功能,请参阅安全指南。
Celery 还带有一个特殊的序列化程序,该序列化程序使用加密技术对您的消息进行签名。
也可以看看
Kombu 中的消息序列化的用户指南。
每个序列化器都有其优点和缺点:
json - JSON 被大多数的编程语言支持,并且现在是 Python 标准的一部分(自2.6开始),并且现代 Python 库(例如 simplejson)具有非常快的 json 解析速度。
JSON 的缺点是会限制你使用如下的数据类型:字符串、Unicode、字典和列表。小数和日期明显缺失。
二进制数据使用 Base64 编码进行传输,这与支持纯二进制传输的相比,数据传输量增长了34%。
但如果你的数据满足上述限制,并且你需要跨语言支持,则 JSON 可能是你的最佳选择。
有关更多信息,请参见 http://json.org。
pickle - 如果你除了 Python 外,并不需要支持其他语言,那么使用 pickle 编码将让你获得对所有 Python 内建类型的支持(类实例除外)。相比 JSON,使用 pickle 序列化的二进制文件更小,传输速度更快。
请参阅 pickle 获得更多信息。
yaml - YAML 和 JSON 有许多相似的特征,yaml 支持包括日期、递归引用在内的更多数据类型。然而,Python 的 YMAL 库相比 JSON 库 要慢很多。
如果你需要更具表现能力的数据集合,则 YMAL 比上面的序列化方式更适合。
有关更多信息,请参见 http://yaml.org/。
msgpack - msgpack 是一种接近 JSON 的二进制序列化格式。但是,它还很年轻,因此此时应该将支持视为实验性的
有关更多信息,请参见 http://msgpack.org/。
编码类型可以用作消息头,因此 workers 知道如何反序列化所有的任务。如果你使用自定义序列方案,则该序列化必须被 workers 支持。
发送任务时的序列化配置优先级如下(从高到低):
1.serializer 执行选项。
2.Task.serializer 属性。
3.task_serializer 属性。
为单个任务调用设置序列化方式:
>>> add.apply_async((10, 10), serializer='json')

具体详情,请参考celery官方文档

 

使用 "pickle" 来做序列化,这样我们就可以在异步或定时任务传参的时候,传输文件流来操作文件了。

                                                                                                                                                                                                                以上就是我在使用celery的时候踩到的坑。为了避免大家踩坑!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值