在分布式计算项目中,我们使用Pyro在节点之间传递对象;Pyro使用pickle在内部序列化和反序列化对象。你知道吗
项目中的一些类有两种实现:一种是纯Python(为了便于安装,特别是Windows用户),另一种是c++/boost::Python(速度要快得多,但需要boost+关于如何编译扩展模块的知识)。python和c++类都支持pickling(在c++中,通过boost::python完成)。你知道吗
这些类有不同的完全限定名(mupif.Octree.Octant
和mupif.fastOctant.Octant
),但后者是前者的别名,并覆盖纯Python定义(mupif.Octree.Octant=mupif.fastOctant.Octant
),因此它对用户是透明的,如果节点上可用,则始终使用fast变体。你知道吗
但是,pickle使用__module__
和__class__
来标识实例,因此当基于c++的对象通过连接传递到另一个不支持它的节点时,取消pickle将失败。你知道吗
解决这个问题的办法是什么?更改类的__module__
,即foo.fastOctant.Octant.__class__.__module__='mupif.Octree'
是否可以接受?会不会有副作用我还没看到?你知道吗
如果没有可用的fast实现,那么用另一种方式(fast=normal)别名是否有帮助?也许这只能在取消勾选然后反转时进行,以避免在其他代码中混淆检查?你知道吗
相关问题 更多 >
编程相关推荐