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 的效率是最高的, 四种协议都有的一个特性是解码效率要远低于编码效率.
注意虽然他们的编解码效率存在差异, 但是这不能作为选择协议类型的参考, 因为这里的效率损耗对于完成一个请求中所占实在太少, 或者可以根据需求自行测试.
数据类型支持
更应该考虑的是他们支持的数据类型, 比如 cloudpickle 和 dill 可以发送函数和类等高级对象来实现一些原版协议实现不了的功能, 下面是各个协议支持的数据类型.
| 类型 | json | pickle | cloudpickle | dill |
|---|---|---|---|---|
| int | ✅ | ✅ | ✅ | ✅ |
| float | ✅ | ✅ | ✅ | ✅ |
| str | ✅ | ✅ | ✅ | ✅ |
| bool | ✅ | ✅ | ✅ | ✅ |
| None | ✅ | ✅ | ✅ | ✅ |
| complex | ❌ | ✅ | ✅ | ✅ |
| list | ✅ | ✅ | ✅ | ✅ |
| tuple | ✅ | ✅ | ✅ | ✅ |
| set | ❌ | ✅ | ✅ | ✅ |
| dict | ✅ | ✅ | ✅ | ✅ |
| datetime | ❌ | ✅ | ✅ | ✅ |
| 类 | ❌ | ❌ | ✅ | ✅ |
| 实例 | ❌ | ❌ | ✅ | ✅ |
| 普通函数 | ❌ | ❌ | ✅ | ✅ |
| 使用全局变量的函数 | ❌ | ❌ | ✅ | ❌ |
| 使用函数外部包的函数 | ❌ | ❌ | ✅ | ❌ |
| 在函数内部导入包的函数 | ❌ | ❌ | ✅ | ✅ |
| 匿名函数 | ❌ | ❌ | ✅ | ✅ |
| Pandas DataFrame | ❌ | ✅ | ✅ | ✅ |
| Numpy Array | ❌ | ✅ | ✅ | ✅ |
可以查看 cloudpickle 和 dill 文档查看其他支持的数据类型和一些使用注意事项.