给出cloudpickle的GitHub地址:

https://github.com/cloudpipe/cloudpickle

=======================================================

单机的Python序列化模块有自带的pickle,但是在Python的分布式计算中进行序列化则是使用cloudpickle。之所以在分布式计算中Python的序列化使用cloudpickle模块的原因有:

1. cloudpickle是使用value序列化的方式,而pickle则是使用reference序列化的方式。因此在反序列化时pickle需要运行环境内存在序列化对象的定义,因为pickle进行序列化的只是对象(函数、类对象)的参数;而cloudpickle在序列化时会把对象的定义和参数值一并序列化,所以在分布式计算中传递cloudpickle序列化对象时接受方可以没有对象的定义(如果序列化的是类对象,那么接收方可以没有类的定义)。

例子:

import pickle

class A():pass

a=A()

a_pick = pickle.dumps(a)
a_unpick = pickle.loads(a_pick)
print(a_unpick) del A
b_unpick = pickle.loads(a_pick)

import cloudpickle as pickle

class A():pass

a=A()

a_pick = pickle.dumps(a)
a_unpick = pickle.loads(a_pick)
print(a_unpick) del A
b_unpick = pickle.loads(a_pick)

--------------------------------------------------------

import cloudpickle, pickle

CONSTANT = 42
def my_function(data: int) -> int:
return data + CONSTANT pickled_function = cloudpickle.dumps(my_function)
pickled_function_2 = pickle.dumps(my_function) CONSTANT = 0
depickled_function = cloudpickle.loads(pickled_function)
depickled_function_2 = pickle.loads(pickled_function_2) print(depickled_function(43))
print(depickled_function_2(43))

2. pickle模块不能序列化lambda函数,cloudpickle可以序列化lambda函数。

例子:

import pickle
squared = lambda x: x ** 2
pickled_lambda = pickle.dumps(squared) new_squared = pickle.loads(pickled_lambda)
new_squared(2)

import cloudpickle as pickle
squared = lambda x: x ** 2
pickled_lambda = pickle.dumps(squared) new_squared = pickle.loads(pickled_lambda)
new_squared(2)

===========================================

从上面的例子可以看出,cloudpickle更像是打包序列化,在序列化一个对象时会把该对象设计到的参数和定义也一并打包进行序列化。那么cloudpickle有没有打包不了的对象呢,这个确实还是有的,那就是序列化对象(函数、类对象)中如果包含有import语句的并不会把import语句中所涉及的对象进行一并打包。对于cloudpickle不能把序列化对象中包含的import引入的对象一并打包这个事情我个人的观点是其实现的难点在于import对象中会涉及大量的对象,这样进行一并打包要包含哪些对象难以确定、并且全部打包也是会造成序列化后对象字节码过长、序列化用时过长等问题。

例子:

模块: another_module.py

def g():
print("hello world")
return 100

模块 x.py:

def f():
from another_module import g
return g()+1 import cloudpickle
fff=open("data", "wb")
fff.write(cloudpickle.dumps(f))

运行 x.py,把序列化后字节数据存入data文件中:

----------------------------------

给出反序列化文件  y.py:

import cloudpickle
fff=open("abc", "rb")
f = cloudpickle.loads(fff.read())
f()

如果把序列化文件data和反序列化文件y.py放在另一个单独的文件夹中并运行y.py,结果如下:

可以看到,使用cloudpickle并没有把涉及到的import语句中引入的对象进行一并的打包序列化。

PS:    cloudpickle的底层实现依旧是调用pickle模块,可以说cloudpickle模块是对pickle模块的进一步包装,其实现的功能就是把pickle序列化中没有打包的对象以value的形式进行一并打包。

====================================================

cloudpickle —— Python分布式序列化的专用模块的更多相关文章

  1. Python:序列化 pickle JSON

    序列化 在程序运行的过程中,所有的变量都储存在内存中,例如定义一个dict d=dict(name='Bob',age=20,score=88) 可以随时修改变量,比如把name修改为'Bill',但 ...

  2. Python库:序列化和反序列化模块pickle介绍

    1 前言 在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述. 通过简单示例来理解什么是机器学习 pickle是python语言的一个标准模块,安装pyt ...

  3. python 序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  4. python之序列化模块、双下方法(dict call new del len eq hash)和单例模式

    摘要:__new__ __del__ __call__ __len__ __eq__ __hash__ import json 序列化模块 import pickle 序列化模块 补充: 现在我们都应 ...

  5. Python基础(正则、序列化、常用模块和面向对象)-day06

    写在前面 上课第六天,打卡: 天地不仁,以万物为刍狗: 一.正则 - 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法: - 在线正则工具:http://tool ...

  6. 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...

  7. python模块知识二 random -- 随机模块、序列化 、os模块、sys -- 系统模块

    4.random -- 随机模块 a-z:97 ~ 122 A-Z :65 ~ 90 import random #浮点数 print(random.random())#0~1,不可指定 print( ...

  8. Python 序列化 pickle/cPickle模块

    Python 序列化 pickle/cPickle模块 2013-10-17 Posted by yeho Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给 ...

  9. python序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  10. [python] ​Python数据序列化模块pickle使用笔记

    pickle是一个Python的内置模块,用于在Python中实现对象结构序列化和反序列化.Python序列化是一个将Python对象层次结构转换为可以本地存储或者网络传输的字节流的过程,反序列化则是 ...

随机推荐

  1. ConvertLatOrLonFilter-经纬度格式转换-保留6位

    ConvertLatOrLonFilter-经纬度格式转换-保留6位 /** * 转换经纬度 * 小数点最后最多为6位 * @param latOrLon * @return */ private S ...

  2. 15-容器简介与Docker安装

    传统企业应用构建 应用被直接部署在操作系统之上,并且操作系统直接安装于硬件之上应用被操作系统绑定 操作系统被硬件绑定 缺点 部署非常慢(启动应用的速度非常慢) 成本非常高(原有服务器的操作系统不支持这 ...

  3. IPTABLES管理

    iptables 是 Linux 管理员用来设置 IPv4 数据包过滤条件和 NAT 的命令行工具.iptables 工具运行在用户态,主要是设置各种规则.而 netfilter 则运行在内核态,执行 ...

  4. QT学习:06 常用的全局变量与宏定义

    --- title: framework-cpp-qt-06-常用的全局变量与宏定义 EntryName: framework-cpp-qt-06-global date: 2020-04-10 11 ...

  5. mysql判断两个字符串(以逗号分隔)是否存在交集

    转载:https://blog.csdn.net/username666/article/details/107815331?utm_medium=distribute.pc_relevant.non ...

  6. Mybatis 中 foreach 的四种用法

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...

  7. Mysql与Redis如何保证数据的一致性?

    问题分析: 当MySQL中的数据发生更新时,就面临一个问题,如何确保MySQL与Redis数据的一致性,我们有两个选择: 先更新MySQL,后删除(或更新)Redis 先删除(或更新)Redis,后更 ...

  8. Spring注解之生命周期@PostConstruct和@PreDestroy

    ****### 简介 从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct. 这两个注 ...

  9. java将list中某个元素放在首位

    java将list中某个元素放在首位 1 List<Example> example = exampleRepository.list(); 2 3 //将list里的某个字符串默认排列在 ...

  10. Apache Kyuubi 在B站大数据场景下的应用实践

    01 背景介绍 近几年随着B站业务高速发展,数据量不断增加,离线计算集群规模从最初的两百台发展到目前近万台,从单机房发展到多机房架构.在离线计算引擎上目前我们主要使用Spark.Presto.Hive ...