¿Cómo detecta Python & referencias de memoria circular libre antes de hacer uso del módulo gc?
No lo es. El gc existe solo a detectar y referencias circulares libres. Las referencias no circulares se manejan a través de refcounting.
Ahora, para ver cómo gc determina el conjunto de objetos referenciados por cualquier objeto dado, echar un vistazo a la función gc_get_references
en Modules/gcmodule.c
. El bit relevante es:
// Where `obj` is the object who's references we want to find
traverseproc traverse;
if (! PyObject_IS_GC(obj))
continue;
traverse = Py_TYPE(obj)->tp_traverse;
if (! traverse)
continue;
if (traverse(obj, (visitproc)referentsvisit, result)) {
Py_DECREF(result);
return NULL;
}
La función principal aquí es tp_traverse
. Cada tipo de nivel C define una función tp_traverse
(o en el caso de objetos que no tienen ninguna referencia, como str
, lo establece en NULL
). Un ejemplo de tp_traverse
es list_traverse
, la función de recorrido para list
:
static int
list_traverse(PyListObject *o, visitproc visit, void *arg)
{
Py_ssize_t i;
for (i = Py_SIZE(o); --i >= 0;)
Py_VISIT(o->ob_item[i]);
return 0;
}
lo que veo es una declaración que se detectan referencias circulares, excepto cuando los objetos involucrados tienen un método __del__()
.
Estás en lo correcto - detector de ciclo de Python puede detectar y recoger los ciclos menos que contienen objetos con un método __del__
, ya que no hay manera para que el intérprete para eliminar de forma segura estos objetos (para obtener una intuición sobre por qué esto es decir, imagine que tiene dos objetos con métodos __del__
que se referencian entre sí. ¿En qué orden deberían liberarse?).
Cuando los objetos con un método __del__
están involucrados en un ciclo, el recolector de basura los pegará en una lista separada (accesible a través de gc.garbage
) para que el programador pueda "tratarlos" manualmente.
" ..pero está garantizada _No_ para recoger la basura que contiene referencias circulares " Diga [docs] (http://docs.python.org/reference/datamodel.html). –
¿Puede vincular la página de la documentación a la que se refiere? –
Aquí está la página que estaba leyendo: http://docs.python.org/extending/extending.html#reference-counts – user1245262