2016-11-21 3 views
0

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.

Antwort

1

Sie spawnen mehrere Prozesse. Dank der Magie des virtuellen Speichers können (dürfen) Sie nicht erwarten, dass zwei verschiedene Prozesse die gleichen Adressen haben.

Zu Ihrer Frage:

Gibt es eine Möglichkeit irgendwie die gleiche Instanz zu halten?

Nicht wirklich, weil Sie separate Prozesse starten. Wenn Sie jedoch darauf bestehen, können Sie "shared memory" verwenden, um eine einzelne Instanz einer Datenstruktur zwischen Prozessen zu teilen.

+0

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

+0

Ich könnte mich irren, aber da die GIL realen Shared Memory verhindert, sind die Argumente für 'mp.Process' nicht serialisiert? – erip

+1

@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. –

Verwandte Themen