2017-02-23 1 views
1

Ich habe in meinem Code ein paar Worker-Threads, die einige Arbeit ausführen. Die Daten aus der Arbeit werden in einer kleinen Klasse gesammelt, die diese Informationen enthält. Diese Klasse wird zur Verarbeitung im Hauptthread in eine Warteschlange gestellt.Wie sammelt der GC eine Klassenreferenz von zwei Threads

Wann wird diese Klasse vom GC erfasst?

Short Sodu excample:

def run(in_q, out_q): 
    lp = lpClass() 

    # Do work and add info in class 
    workToDo = in_q.get_nowait() 

    while working: 
    lp.add(work data) 

    out_q.put_nowait(lp) 


# main 

t = thread(run, in_q, out_q) 
t.start() 
in_q.put_nowait(some work) 
t.join() 

while out_q.not_empty: 
    lp = out_q.get() 

    print(lp.getData()) 

Antwort

3

Python Garbage Collector allgemein wirft Objekte aus, die nicht mehr referenziert.

In Ihrem Fall wäre dies nach dem print() in der While-Schleife abgeschlossen, und beginnt über - ersetzen die vorherigen Daten in lp mit einer neuen Referenz. Das alte Objekt wird daher nicht mehr referenziert und der Müll wird gesammelt.

Afaik, dies gilt sowohl für Multithread-Programme als auch für Singlethread-Programme.

Abgesehen von der Python-Dokumentation hat this post eine gut geschriebene Zusammenfassung, wenn der Garbage Collector in Python seine Sache macht.

Verwandte Themen