многопроцессорность - совместное использование сложного объекта

У меня большойdict-подобный объект, который должен быть разделен между несколькими рабочими процессами. Каждый работник читает случайное подмножество информации в объекте и выполняет с ним некоторые вычисления. Я хотел бы избежать копирования большого объекта, так как моей машине быстро не хватает памяти.

Я играл с кодом дляэтот ТАК вопрос и я немного изменил его, чтобы использовать пул процессов фиксированного размера, который лучше подходит для моего варианта использования. Это, однако, кажется, сломать его.

from multiprocessing import Process, Pool
from multiprocessing.managers import BaseManager

class numeri(object):
    def __init__(self):
        self.nl = []

    def getLen(self):
        return len(self.nl)

    def stampa(self):
        print self.nl

    def appendi(self, x):
        self.nl.append(x)

    def svuota(self):
        for i in range(len(self.nl)):
            del self.nl[0]

class numManager(BaseManager):
    pass

def produce(listaNumeri):
    print 'producing', id(listaNumeri)
    return id(listaNumeri)

def main():
    numManager.register('numeri', numeri, exposed=['getLen', 'appendi',
                        'svuota', 'stampa'])
    mymanager = numManager()
    mymanager.start()
    listaNumeri = mymanager.numeri()
    print id(listaNumeri)

    print '------------ Process'
    for i in range(5):
        producer = Process(target=produce, args=(listaNumeri,))
        producer.start()
        producer.join()

    print '--------------- Pool'
    pool = Pool(processes=1)
    for i in range(5):
        pool.apply_async(produce, args=(listaNumeri,)).get()

if __name__ == '__main__':
    main()

Выход

4315705168
------------ Process
producing 4315705168
producing 4315705168
producing 4315705168
producing 4315705168
producing 4315705168
--------------- Pool
producing 4299771152
producing 4315861712
producing 4299771152
producing 4315861712
producing 4299771152

Как видите, в первом случае все рабочие процессы получают один и тот же объект (по идентификатору). Во втором случае идентификатор не совпадает. Означает ли это, что объект копируется?

Постскриптум Я не думаю, что это имеет значение, но я используюjoblib, который внутренне использовалPool:

from joblib import delayed, Parallel

print '------------- Joblib'
        Parallel(n_jobs=4)(delayed(produce)(listaNumeri) for i in range(5))

какие выводы:

------------- Joblib
producing 4315862096
producing 4315862288
producing 4315862480
producing 4315862672
producing 4315862352

Ответы на вопрос(3)

Ваш ответ на вопрос