Ich frage mich, warum die Child-Prozesse verschiedene Objektadressen ausdrucken. Ich habe es auch mit einem Manager versucht, aber es hat keinen Einfluss auf das Ergebnis.Python Multiprocessing: Warum haben Objekte Instanzen nicht dieselbe Adresse?
import time
import multiprocessing as mp
class TestO:
def __init__(self, a):
self.a = a
def get_name(self):
return self.a
def run_task(tasks,nr):
obj = tasks[nr]['data']
print obj, obj.get_name()
if __name__ == "__main__":
tasks = dict()
a = TestO('first')
b = TestO('second')
tasks[1] = {'data': a}
tasks[2] = {'data': b}
process1 = mp.Process(target = run_task, name = 'process1', args = (tasks, 1))
process2 = mp.Process(target = run_task, name = 'process2', args = (tasks, 2))
process1.start()
time.sleep(0.2)
process2.start()
process1.join()
process2.join()
print a, 'first'
print b, 'second'
Dies gibt kopiert das Ergebnis
<__main__.TestO instance at 0x02EFD2D8> first
<__main__.TestO instance at 0x0373D300> second
<__main__.TestO instance at 0x043663C8> first
<__main__.TestO instance at 0x043663F0> second
Werden die Instanzen? Gibt es eine Möglichkeit, dieselbe Instanz irgendwie zu behalten? Ich habe Probleme mit einer komplexeren Version des obigen, wo die Klassenobjekte komplexer sind. Das Ergebnis, das ich in diesem Fall erhalte, besteht darin, dass die Werte, die ich für die Objektinstanzen gesetzt habe, ungültig werden, nachdem sie mp.Process
eingegeben haben, d. H. obj.get_name
gibt None
zurück.
Wie würde ich Shared Memory mit dem von mir bereitgestellten Beispiel verwenden? Ich dachte, mit einem Manager wäre das gleiche wie Shared Memory, aber ich bekomme auch andere Adressen in diesem Fall. – Chicony
Ich könnte mich irren, aber da die GIL realen Shared Memory verhindert, sind die Argumente für 'mp.Process' nicht serialisiert? – erip
@Chicony: Wenn Sie einen Manager verwenden, können Sie Freigabe erhalten, aber die Adressen werden immer noch wegen "virtueller Speicher" anders sein. Lesen Sie im virtuellen Speicher nach und Sie werden sehen. Nur weil zwei Dinge an zwei verschiedenen virtuellen Adressen existieren, sagt das nicht, ob es sich um dieselbe Instanz handelt, wenn es um zwei verschiedene Prozesse geht. –