Was passiert mit Objekten, wenn der Interpreter herunterfährt?

8

Ich bin ein wenig verwirrt, was mit Objekten passiert, wenn der Python-Interpreter herunterfährt. Wenn ich so einen kleinen Code schreibe

%Vor%

und es ausführen, ich werde das

bekommen %Vor%

Nach meinem Verständnis werden alle Verweise auf erstellte Objekte gelöscht, wenn der Interpreter herunterfährt, und diese Objekte werden __del__() ausführen, wenn sie angegeben sind (weil ref ref für sie 0 ist).

Meine Verwirrung ist, weil:

  1. Ich kann keine Dokumentation finden, die besagt, dass python alle Referenzen beim Beenden löscht.
  2. Ich bin verwirrt, warum es Objekte säubert, wenn der Speicher bald ins Betriebssystem zurückkehrt und trotzdem frei ist. Ich schätze, in komplexen Systemen kostet das Löschen von Objekten im Speicher, die ohnehin frei sein sollen, sehr viel.
  3. Lesen von Dokumenten über __del__() Ich sehe das It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits. Und es wird ein bisschen komplizierter, sagen sie, dass es wegen einiger Zyklusabhängigkeiten nicht garantiert ausgeführt wird, oder es ist einfach nicht garantiert? Wer entscheidet das?

Meine Fragen sind also:

  1. Wer in meinem obigen Beispiel __del__ aufgerufen hat
  2. Warum es nicht guaranteed ist, wenn ich keine Referenzzyklen habe
Alexander Starostin 19.10.2014, 23:38
quelle

1 Antwort

2

Ich sehe den Punkt der ersten Frage nicht, aber für CPython 2.7.8 wird __del__ von PyInstanceObject.instance_dealloc aufgerufen, das als tp_dealloc registriert ist, das aufgerufen wird, wenn Py_DECREF aufgerufen wird und die Referenzzählung erreicht Null. Sagen wir also, der Interpreter nennt es, nicht Python-Code. Wenn Sie diese Frage mit der Hoffnung stellen, dass Sie ändern können, wie oder wann es aufgerufen wird, glaube ich nicht, dass es möglich ist.

Warum dies nicht garantiert ist, müssen Sie alle Module durchlaufen, die ihre Variablen vor dem Beenden löschen. Wenn sich die __del__ -Methoden jedoch auf globale Variablen verlassen, gibt es keine einfache Möglichkeit, eine sichere Reihenfolge zu garantieren damit sie ausgeführt werden. Ich sage nicht, dass es unmöglich ist, wie bei Referenzzyklen, ich sage es ist kompliziert.

Ich stelle mir vor, dass dies irgendwann diskutiert wurde, aber die Gemeinde oder der BDFL entschieden, dass es sich nicht lohnt. Ich glaube, ich habe vor Jahren eine Diskussion darüber gesehen, aber ich konnte sie jetzt nicht finden. Die Verwendung der __del__ -Methode wurde von vornherein nicht empfohlen, und wenn Sie sicherstellen müssen, dass eine Destruktor-Methode aufgerufen wird, verwenden Sie möglicherweise besser Kontext-Manager.

    
Pedro Werneck 20.10.2014 01:21
quelle

Tags und Links