Изоляция пользовательского диспетчера многопроцессорности и способы обновления внутреннего состоянияPython

Программы на Python
Anonymous
 Изоляция пользовательского диспетчера многопроцессорности и способы обновления внутреннего состояния

Сообщение Anonymous »

Я пытаюсь использовать собственный менеджер многопроцессорности, в основном следуя примеру из документации. Основное отличие состоит в том, что мой класс обновляет внутреннее состояние. Выглядит это так:

Код: Выделить всё

class IdIndex:
def __init__(self):
self.data = set()
self.call_count = 0
self.lock = multiprocessing.Lock()

def get_new_ones(self, ids):
with self.lock:
self.call_count += 1
new_ones = ids - self.data
self.data.update(new_ones)
return new_ones

class IndexManager(BaseManager):
pass

IndexManager.register("ids", IdIndex)
Позже я использую это так:

Код: Выделить всё

with IndexManager() as index:
# pass index.ids() proxies to subprocesses
Насколько я понимаю, IndexManager запускает новый процесс, в котором размещается единственный экземпляр IdIndex. Если я вызову get_new_ones на одном из прокси-объектов, вызов будет перенаправлен на единственный экземпляр в выделенном процессе и будет обработан там. Таким образом, должен быть только один «общий» экземпляр IdIndex. Даже self.lock не нужен.
Судя по тому, что я наблюдаю на основе подробного журналирования, это понимание неверно. self.call_count как бы увеличивается, но не последовательно. Похоже, что либо было несколько экземпляров IdIndex, либо что-то кэшировано в прокси-объектах. Но мне трудно понять, что происходит на самом деле. Если я зарегистрирую self.call_count, я получу что-то вроде 1,2,3,4,4,5,6,4,5,5,7,8,8,...
Может ли кто-нибудь объяснить, что не так с моим пониманием и как это настроить, чтобы у меня был только один экземпляр IdIndex?

Подробнее здесь: https://stackoverflow.com/questions/797 ... rnal-state

Вернуться в «Python»