Multiprocessing - Teilen eines komplexen Objekts

Ich habe eine großedict-ähnliches Objekt, das von mehreren Arbeitsprozessen gemeinsam genutzt werden muss. Jeder Mitarbeiter liest eine zufällige Teilmenge der Informationen im Objekt und führt eine Berechnung damit durch. Ich möchte vermeiden, das große Objekt zu kopieren, da auf meinem Computer schnell kein Speicher mehr verfügbar ist.

Ich habe mit dem Code für gespieltdiese SO Frage und ich habe es ein wenig modifiziert, um einen Prozesspool mit fester Größe zu verwenden, der besser für meinen Anwendungsfall geeignet ist. Dies scheint jedoch zu brechen.

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()

Die Ausgabe ist

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

Wie Sie sehen, erhalten im ersten Fall alle Worker-Prozesse dasselbe Objekt (anhand der ID). Im zweiten Fall ist die ID nicht dieselbe. Bedeutet das, dass das Objekt kopiert wird?

P.S. Ich denke nicht, dass das wichtig ist, aber ich benutzejoblib, die intern aPool:

from joblib import delayed, Parallel

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

welche Ausgänge:

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage