Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

Python resource_tracker y leaked shared_memory: asigna un solo dueño

Antes de cambiar track, registra creador, adjuntos y familias de tracker. Un solo proceso debe poseer unlink; prueba supervivencia y limpieza.

Original diagram mapping a shared-memory creator, attachers, tracker family and one unlink owner.
Ilustración original: asigna un solo dueño de ciclo de vida antes de cambiar track. Watch at Ease

Una advertencia de resource_tracker no demuestra que falte close(). Dos familias independientes de Python pueden creer que poseen el mismo nombre POSIX; el primer tracker que termina puede borrar un nombre aún necesario.

La reparación es una decisión de propiedad. Registra versión, plataforma, ascendencia de procesos, creador, adjuntos y orden de cierre; asigna un solo dueño de unlink y después elige track.

Congela la topología de procesos

Registra sistema, versión de Python, start method, gestor, PID creador, PID de adjuntos, forma de lanzamiento y orden de salida. Terminales, árboles subprocess, contenedores y workers uWSGI pueden tener trackers distintos.

Guarda nombre exacto, create, track, cada close/unlink, advertencia original y si falló un attach posterior.

Separa handle, mapeo y vida del nombre

close() termina el acceso de este objeto. En POSIX, unlink() elimina el nombre; mapeos y recuperación final siguen reglas de plataforma. Un close local no prueba que el nombre siga disponible ni que tenga dueño de limpieza.

Crea una fila por nombre con creador, adjuntos activos, familia tracker, dueño duradero, responsabilidad de close y un solo responsable de unlink.

Elige dueño antes de track

En una familia multiprocessing, el tracker compartido puede limpiar salidas anómalas, pero la aplicación aún cierra handles y mantiene una ruta normal de unlink. No hagas unlink en cada worker.

Para procesos independientes o en otro lenguaje, usa un coordinador que viva más que los consumidores. En Python 3.13+, un adjunto no dueño usa track=False solo si otro actor posee la limpieza.

Mantén ramas por versión y plataforma

Antes de Python 3.13 no existe track público. No uses unregister privado ni monkey patches como arreglo general; actualiza, unifica la familia o usa un coordinador explícito.

Windows ignora track; un nombre POSIX puede persistir hasta unlink y el último unmap. Define aceptación distinta por plataforma.

Ejecuta una prueba de cierre doble

Inicia dueño y dos no dueños, escribe un marcador y detén un no dueño. Un nuevo adjunto debe abrir el mismo nombre y leer el marcador.

Detén el otro no dueño y finalmente el dueño con un solo unlink. Después, un attach nuevo debe fallar; prueba terminación anómala en un fixture desechable.

Original decision diagram requiring shared-memory survival after a non-owner exits and cleanup after the owner exits.
Ilustración original: prueba supervivencia y limpieza final por separado. Watch at Ease