Pregunta

Sólo por el puro gusto de hacerlo, he decidido crear una Esquema unión a libpython por lo puede incrustar Python en los programas de Scheme. Yo ya soy capaz de poner en API de Python C, pero realmente no he pensado en la gestión de memoria.

FFI de la MzScheme forma en que funciona es que puedo llamar a una función, y si esa función devuelve un puntero a una PyObject, entonces puedo tenerlo incrementar automáticamente la cuenta de referencia. Entonces, puedo registrar un finalizador que disminuir el número de referencia cuando el objeto se pone Esquema basura recogida. He mirado en la documentación para el recuento de referencias , y no hacer ver cualquier problema con este a primera vista (aunque puede ser sub-óptima en algunos casos). ¿Hay algunas trampas que me faltan?

Además, estoy teniendo cabezas o colas de la href="http://docs.python.org/c-api/gcsupport.html" rel="noreferrer"> cíclica documentación recolector de basura . Qué cosas voy a tener que tener en cuenta aquí? En particular, ¿cómo puedo hacer Python consciente de que tengo una referencia a algo por lo que no se acumule mientras todavía estoy usando?

¿Fue útil?

Solución

Su enlace con http://docs.python.org/extending/extending .html # referencia recuentos es el lugar adecuado. Las secciones de la API de incrustación y Python / C que se extenderá y de la documentación son los que van a explicar cómo utilizar la API C.

recuento de referencia es una de las partes molestos de utilizar la API C. El Gotcha principal es mantener todo en su lugar: Dependiendo de la función de la API se llama, que puede o no poseer la referencia al objeto que se obtiene. Tenga cuidado para entender si usted es el dueño (y por lo tanto no se puede olvidar a DECREF o darlo a algo que va a robarlo) o están tomándolo prestado (y debe INCREF para mantenerlo y, posiblemente, para utilizarlo durante su función). Los errores más comunes que implican este son: 1) recordar de forma incorrecta si usted es dueño de una referencia devuelta por una función particular, y 2) que la creencia son seguros para tomar prestada una referencia para un tiempo más largo de lo que eres.

Usted no tiene que hacer nada especial para el recolector de basura cíclico. Es sólo allí para arreglar un defecto en el recuento de referencias y no requiere acceso directo.

Otros consejos

El mayor Gotcha Sé que con el conteo de referencia y la API C es la cosa __del__. Cuando se tiene una referencia a algo prestado, piensa que puede salirse sin INCREF'ing porque no renuncia al GIL mientras se utiliza esa referencia. Pero, si al final de la eliminación de un objeto (mediante, por ejemplo, la eliminación de una lista), es posible que se activa una llamada __del__, lo que podría eliminar la referencia que tome prestado de debajo de sus pies. Muy difícil.

Si INCREF (y luego DECREF, por supuesto) todas las referencias tomadas tan pronto como lo reciba, no debería haber ningún problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top