9.协议 - EVA-JianJun/ChatRoom-V3 GitHub Wiki

协议

底层序列化协议, 现在支持 json, pickle, cloudpickle, dill 四种传输协议.

通过对协议的拓展可以支持额外的数据类型, 或者增加安全性, 目前只有 json 协议是安全的, 其余三种可能会有安全问题.

协议效率

在对同一数据进行发送时测试效率结果如下.

json
41 µs ± 105 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
解码 13s

pickle
16.8 µs ± 1.14 µs per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
解码 95s / 10 = 9.5s

cloudpickle
41 µs ± 452 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
解码 11s

dill
82.7 µs ± 328 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
解码 11s

可以看出 pickle 的效率是最高的, 四种协议都有的一个特性是解码效率要远低于编码效率.

注意虽然他们的编解码效率存在差异, 但是这不能作为选择协议类型的参考, 因为这里的效率损耗对于完成一个请求中所占实在太少, 或者可以根据需求自行测试.

数据类型支持

更应该考虑的是他们支持的数据类型, 比如 cloudpickledill 可以发送函数和类等高级对象来实现一些原版协议实现不了的功能, 下面是各个协议支持的数据类型.

类型       json           pickle     cloudpickle       dill     
int
float
str
bool
None
complex
list
tuple
set
dict
datetime
实例
普通函数
使用全局变量的函数
使用函数外部包的函数
在函数内部导入包的函数
匿名函数
Pandas DataFrame
Numpy Array

可以查看 cloudpickledill 文档查看其他支持的数据类型和一些使用注意事项.