Как Python обнаруживает & бесплатные ссылки на циркулярную память перед использованием модуля gc?
Это не так. Gc существует только до обнаружение и бесплатные циркулярные ссылки. Некруглые ссылки обрабатываются путем пересчета.
Теперь, чтобы увидеть, как дс определяет набор объектов, на которые ссылается любого объекта, посмотрите на gc_get_references
функции в Modules/gcmodule.c
. Соответствующий бит:
// 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;
}
Основная функция здесь tp_traverse
. Каждый тип уровня С определяет функцию tp_traverse
(или в случае объектов, которые не содержат никаких ссылок, например str
, устанавливает ее в NULL
). Одним из примеров являются tp_traverse
list_traverse
, функция обхода для 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;
}
я вижу, это утверждение, что циклические ссылки обнаружены, кроме случаев, когда объектов задействованных метода __del__()
.
Вы правильно - детектор цикла Python может обнаружить и собрать циклы если они не содержат объекты с методом __del__
, так как нет никакого способа для интерпретатора, чтобы безопасно удалить эти объекты (чтобы получить интуиции о том, почему это Представьте, что у вас есть два объекта с методами __del__
, которые ссылаются друг на друга. В каком порядке они должны быть освобождены?).
Когда объекты с использованием метода __del__
задействованы в цикле, сборщик мусора будет вставлять их в отдельный список (доступный через gc.garbage
), чтобы программист мог вручную «разобраться» с ними.
»..но _выключена_ гарантируется для сбора мусора, содержащего циклические ссылки «. Скажите [docs] (http://docs.python.org/reference/datamodel.html). –
Вы можете связать страницу с документацией, на которую вы ссылаетесь? –
Вот страница, которую я читал: http://docs.python.org/extending/extending.html#reference-counts – user1245262