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?
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
@Blckknght: alles außer einer einfachen Suche, oder? –