2016-06-22 16 views
1

Ich habe eine Datenstruktur L (es könnte eine Liste, ein Diktat, ... sein) und ich brauche mehrere Prozesse, um daraus zu lesen. Ich möchte kein multiprocessing.Manager verwenden, weil es langsam ist.Python-Multiprozessing - Wann wird ein referenziertes Objekt geteilt? Wann wird es kopiert?

Jetzt, wenn L wird nie geändert, die internet sagte mir, es wird nicht vollständig von den Child-Prozesse dank Copy-on-Write kopiert werden. Was aber, wenn L durch das Objekt a referenziert wird, das selbst geändert wird? Funktioniert Copy-on-Write noch? Beispiel:

from multiprocessing import Pool 
from a import A 

READONLYLIST = list(range(pow(10, 6))) # list will never be modified 
a = A(READONLYLIST) # object a will be modified 

def worker(x): 
    return a.worker(x) 

print(Pool(2).map(worker, range(10))) 

Mit Modul a als:

import random 

class A(object): 
    def __init__(self, readonlylist): 
     self.readonlylist = readonlylist 
     self.v = 0 

    def worker(self, x): 
     self.v = random.random() # modify the object 
     return x + self.readonlylist[-1] 

Wird READONLYLIST vollständig durch die untergeordneten Prozesse in diesem Fall kopiert werden?

+0

Ich habe es nicht getestet, aber ich würde vermuten, dass die Ausführung von * anything * mit einem Copy-on-Write-Objekt in Python dazu führt, dass es kopiert wird, da sich der Referenzzähler ändert. – Blckknght

+0

@Blckknght: alles außer einer einfachen Suche, oder? –

Antwort

0

Python multiprocessing teilt Speicher nicht zwischen Prozessen und übergibt Objekte (einschließlich der aufgerufenen Funktion) zwischen Prozessen, indem sie sie beizen (das Objekt als Zeichenfolge darstellt). Wenn Sie also eine Funktion innerhalb eines Pools aufrufen, muss der Hauptprozess die Funktion markieren, die ausgewählte Darstellung der Funktion an jeden Unterprozess übergeben, und dann muss jeder Unterprozess die Funktion aufheben, um die Funktion in einen eigenen separaten Speicher zu setzen.