Я работаю над расширением python, которое выполняет некоторые специализированные древовидные структуры в большой (5GB +) структуре данных в памяти.Совместное использование распределенных распределенных структур данных в процессах python
Основная структура данных уже потокобезопасна (она использует блокировки RW), и я написал оболочку вокруг нее, которая предоставляет ее python. Он поддерживает несколько одновременных считывателей, только один писатель, и я использую pthread_rwlock
для синхронизации доступа. Поскольку приложение очень читаемо, многие читатели должны обеспечить достойное повышение производительности (надеюсь).
Однако я не могу определить, какое правильное решение должно предоставить хранилище данных расширения для совместного доступа к нескольким процессам python, доступ к которым осуществляется через модуль multiprocessing
.
В принципе, я хотел бы что-то похожее на текущую систему multiprocessing.Value
/multiprocessing.Array
, но здесь предостережение заключается в том, что мое расширение выделяет всю собственную память на C++.
Как разрешить нескольким процессам доступ к моей общей структуре данных?
Источники: here (библиотека только для чтения на С ++) и here (обертка Cython).
Прямо сейчас, если я создаю экземпляр дерева, а затем передать ссылки к нескольким процессам, он терпит неудачу с ошибкой сериализации:
Traceback (most recent call last):
File "/usr/lib/python3.4/multiprocessing/queues.py", line 242, in _feed
obj = ForkingPickler.dumps(obj)
File "/usr/lib/python3.4/multiprocessing/reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
TypeError: cannot serialize '_io.TextIOWrapper' object
Я в настоящее время выпуская GIL в моей библиотеке, но есть некоторые будущие задачи, которые в значительной степени выиграют от независимых процессов, и я бы хотел избежать использования RPC-системы для разговора с деревом BK.
FYI, фактическая проблема заключается в том, что ваш класс, как представляется, включает в себя объект-файл, который не подбирается (пользовательское сопряжение '__reduce__' или' __getstate__'/'__setstate__' может использоваться для отправки только имени файла в его снова открыть с другой стороны). Тем не менее, даже если он был сорван, как только он был отправлен другому процессу, он потерял бы связь с объектом в первоначальном процессе; изменение одного не повлияет на другое, что, по-видимому, не является тем, что вам нужно. – ShadowRanger
@ShadowRanger - У него нет файла нигде, посмотрите на источник. Я понятия не имею, что это такое. Может ли что-то обрабатывать мьютекс RW_lock как файл-подобный объект? –
Похоже, что 'CPPBkHammingTree' имеет регистратор в качестве члена' self.log'. Будет ли задействовано его прикрепление к 'stdout' или файлу, будет задействована текстовая оболочка (для преобразования из Unicode в собственные байты кодирования). Это вероятная причина проблем. – ShadowRanger