Pregunta de entrevista para Desarrollador Python

¿Cómo gestiona la memoria CPython?

Qué evalúa el entrevistador, cómo estructurar tu respuesta y un ejemplo hablado que puedes adaptar.

Respuesta rápida

CPython usa el conteo de referencias como mecanismo principal: cada objeto lleva la cuenta de cuántas referencias le apuntan, y se libera de inmediato cuando esa cuenta llega a cero. Por encima corre un recolector de ciclos generacional para atrapar los ciclos de referencias que el conteo por sí solo no puede liberar. La memoria que liberan los objetos pequeños suele volver a los pools internos del asignador y no al sistema operativo.

Por qué lo preguntan los entrevistadores

Las preguntas de memoria salen porque los servicios Python tienen fugas de formas que en realidad no son fugas, y el entrevistador quiere saber si sabes razonar sobre ello. Comprueba que sabes que existen los dos mecanismos, por qué los ciclos necesitan un recolector aparte, y por qué la memoria residente puede quedarse alta después de un pico, que es la falsa alarma más común que se reporta contra los workers de Python.

Cómo estructurar tu respuesta

  • Empieza por el conteo de referencias y la liberación determinista.
  • Explica por qué los ciclos necesitan un recolector aparte.
  • Describe brevemente el diseño generacional.
  • Explica por qué la memoria residente no siempre baja.

Ejemplo de respuesta

Ejemplo hablado, en primera persona

El conteo de referencias hace casi todo el trabajo. Cada objeto lleva una cuenta, asociar un nombre la sube, soltar un nombre la baja, y al llegar a cero el objeto se destruye en ese mismo momento. Ese determinismo es la razón de que un fichero se cierre en cuanto desaparece la última referencia en CPython, aunque no me fiaría de ello en código pensado para correr sobre otras implementaciones. El conteo no puede liberar ciclos, así que un padre que sostiene a un hijo que sostiene al padre nunca llega a cero. De eso se encarga el recolector generacional, con tres generaciones, revisando más a menudo los objetos jóvenes y promocionando a los supervivientes. En un worker de vida larga que depuré, la memoria subía sin parar y resultó ser una caché que guardaba objetos con referencias hacia atrás, más un traceback de excepción guardado en una variable a nivel de módulo, que dejaba frames enteros clavados. Dos snapshots de tracemalloc separados diez minutos apuntaron justo a eso. Vale la pena añadir que liberar objetos a menudo no devuelve páginas al sistema operativo, así que un RSS alto y plano tras un pico es normal y no una fuga.

¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.

Mira cómo funciona

Preguntas de seguimiento que puedes esperar

  • ¿Cómo confirmarías una fuga de memoria en producción?
  • ¿Cuándo llamarías tú mismo a gc.collect?
  • ¿Qué resuelven aquí las referencias débiles?

Más preguntas para Desarrollador Python

Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.

Predecir mis preguntas

Ensaya las preguntas difíciles antes de que te las hagan

Practica con un copiloto en vivo y entra preparado. Un Session Pass de $29 te lleva a través de la entrevista sin suscripción y sin ataduras.

Consigue GhostPilot