В проекте распределенных вычислений мы используем 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
), поэтому он прозрачен для пользователя, и быстрый вариант всегда используется, если он доступен на узле.
Тем не менее, рассол использует __module__
а также __class__
чтобы идентифицировать экземпляр, таким образом, когда объект, основанный на c ++, передается по сети другому узлу, который его не поддерживает, удаление не удастся.
Какое решение для этого? Допустимо ли менять класс __module__
т.е. foo.fastOctant.Octant.__class__.__module__='mupif.Octree'
? Может ли быть побочный эффект, которого я пока не вижу?
Помогает ли псевдоним другим способом (fast = normal), если нет быстрой реализации? Может быть, это можно сделать только на время удаления, а затем наоборот, чтобы не путать проверки в другом коде?
Других решений пока нет …