给出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. Scrapy框架(二)--持久化存储

    持久化存储 scrapy的高性能持久化存储操作,有两种方式:基于终端指令的持久化存储 和 基于管道的持久化存储操作. 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列 ...

  2. mongodb客户端操作语法笔记

    ##登录连接: 进入客户端方法D:\Program Files\MongoDB\Server\5.0\bin>mongo.exe > db.runoob.insert({"nam ...

  3. Windows CSC提权漏洞复现(CVE-2024-26229)

    漏洞信息 Windows CSC服务特权提升漏洞. 当程序向缓冲区写入的数据超出其处理能力时,就会发生基于堆的缓冲区溢出,从而导致多余的数据溢出到相邻的内存区域.这种溢出会损坏内存,并可能使攻击者能够 ...

  4. 记一次cdh6.3.2版本spark写入phoniex的错误:Incompatible jars detected between client and server. Ensure that phoenix-[version]-server.jar is put on the classpath of HBase in every region server:

    Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl. ...

  5. 中台框架模块开发实践-用 Admin.Core 代码生成器生成通用代码生成器的模块代码

    前言 之前分享中台 Admin.Core 的模块代码生成器,陆续也结合群友们的反馈,完善了一些功能和模板上的优化,而本篇将基于此代码生成器生成一个通用代码生成器模块的基本代码 后续再在此代码的基础上进 ...

  6. .Net Core WebAPI Swagger Failed to load API definition

    1.错误现象 1.1.写完一个测试API,Ctrl+F5运行,提示错误: Failed to load API definition.(如下图) 1.2.点击 http://localhost:516 ...

  7. Yuno loves sqrt technology I 题解

    申明:由于本人卡常技艺不佳,本题解复杂度正确但无法通过 首先分块,然后考虑分开计算贡献维护,看下面一张图: 我们将贡献拆分为 \(ans(A) + ans(B) + ans(C) + ans(AB) ...

  8. python实用总结

    Python3 常用工具 1. 命令行快速搭建本地http服务器 python3 -m http.server 8000 在命令行中输入此命令,就会在当前目录下搭建http服务器,可以通过访问http ...

  9. manage.py“Couldn't import Django”报错的问题解决

    问题分析: 在pyharm中项目可以正常运行但是在终端 终端输入python manage.py runserver首次测试项目时,出现了无法引用Django的错误. Traceback (most ...

  10. 权威技术社区InfoQ列网易数帆为年度最有价值技术团队,技术实力获广泛认可

    近日,权威技术社区InfoQ公布数字化转型技术服务商网易数帆为2020年最有价值技术团队,并被授予"最佳技术社区驱动力奖",认可网易数帆在技术领域的突出成就和实力.     Inf ...