在分布式计算项目中,我们使用Pyro在节点之间的线上传递对象。 Pyro使用pickle在内部对对象进行序列化和反序列化。
项目中的某些类具有两种实现:一种是纯Python(为便于安装,尤其是对于Windows用户),一种在c ++ / boost :: python中(速度更快,但需要boost + +如何编译扩展模块知识)。 。 python和c ++类都支持酸洗(在c ++中,这是通过boost :: python完成的)。
这些类具有完全限定的名称(mupif.Octree.Octant
与mupif.fastOctant.Octant
),但是后者是前者的别名,并且会覆盖纯Python定义(mupif.Octree.Octant=mupif.fastOctant.Octant
),因此对用户和快速用户透明如果节点上可用,则始终使用variant。
但是,pickle使用__module__
和__class__
来标识实例,因此,当基于c ++的对象通过导线传递到另一个不支持该对象的节点时,解酸将失败。
有什么解决方案?更改类的__module__
,即foo.fastOctant.Octant.__class__.__module__='mupif.Octree'
是否可以接受?它会产生一些我还没有看到的副作用吗?
最佳答案
如果没有快速实现可用,是否以另一种方式(快速=正常)为别名提供帮助?也许这只能在脱酸时进行,然后再逆转,以免混淆其他代码中的检查?