Frage

Nur für die schiere Heck von ihm, habe ich beschlossen, ein Schema erstellen Bindung so libpython Sie können Python in Schema Programme einbetten. Ich bin bereits in der Lage, in Python-C-API zu nennen, aber ich habe wirklich nicht über Speicherverwaltung gedacht.

Die FFI Weg mzscheme funktioniert, ist, dass ich eine Funktion aufrufen kann, und wenn die Funktion einen Zeiger auf eine PyObject zurückgibt, dann kann ich es automatisch den Referenzzähler erhöht. Dann kann ich einen Finalizer registrieren, die den Referenzzähler dekrementiert wird, wenn das Schema Objekt Müll gesammelt wird. Ich habe an der Dokumentation Referenzzählung sieht, und dies nicht tun siehe Probleme mit diesem auf den ersten Blick (obwohl es suboptimal in einigen Fällen sein kann). Gibt es Fallstricke ich fehle?

Auch ich habe Probleme machen Kopf oder Zahl der zyklischen Garbage Collector Dokumentation . hier Welche Dinge muss ich beachten? Insbesondere wie mache ich Python bewusst, dass ich einen Verweis auf etwas haben, damit es nicht es zu sammeln, während ich es bin immer noch mit?

War es hilfreich?

Lösung

Ihr Link zu http://docs.python.org/extending/extending .html # Referenz-Zählungen der richtige Ort ist. Die Erweiterung und Embedding und Python / C API Abschnitte der Dokumentation sind diejenigen, die erklären, wie die C-API verwenden.

Referenzzählung ist eine der lästigen Teile des C-API. Der Haupt Gotcha hält alles gerade: Abhängig von der API-Funktion Sie anrufen, Sie können oder nicht die Referenz auf das Objekt besitzen können Sie erhalten. Achten Sie darauf, zu verstehen, ob Sie besitzen sie (und damit nicht vergessen, kann es zu DECREF oder es etwas geben, das sie stehlen) oder leihen (und muss es INCREF es zu halten und möglicherweise während Ihrer Funktion zu verwenden). Die häufigsten Fehler dieser Beteiligung sind 1) die Erinnerung nicht richtig, ob Sie mit einer bestimmten Funktion und 2) das Glauben Sie sind sicher zu leihen eine Referenz für eine längere Zeit zurück eine Referenz besitzen, als Sie sind.

Sie haben noch etwas Besonderes für den zyklischen Garbage Collector zu tun. Es ist nur ein Fehler in der Referenzzählung zu flicken und erfordert keinen direkten Zugriff.

Andere Tipps

Der größte Gotcha ich mit ref Zählen und dem C-API kenne, ist die __del__ Sache. Wenn Sie einen geliehenen Bezug auf etwas haben, denken Sie, ohne INCREF'ing weg erhalten können, weil Sie die GIL nicht aufgeben, während Sie diese Referenz verwenden. Aber wenn Sie ein Objekt am Ende Löschen (durch zum Beispiel aus einer Liste zu entfernen), dann ist es möglich, dass Sie einen __del__ Anruf auslösen, die die Referenz entfernen können Sie unter den Füßen sind zu leihen. Sehr schwierig.

Wenn Sie INCREF (und dann DECREF, natürlich) alle geliehenen Referenzen, sobald Sie sie erhalten, es sollte kein Problem sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top