Multiprocessing en Python: paralelismo real esquivando el GIL
Cómo multiprocessing crea procesos reales para ejecutar trabajo CPU-bound en paralelo, y cuándo su overhead lo hace contraproducente.
Cómo multiprocessing crea procesos reales para ejecutar trabajo CPU-bound en paralelo, y cuándo su overhead lo hace contraproducente.
Cómo funciona el modo free-threaded en Python 3.13, su costo real en rendimiento, y qué código se rompe al eliminar el GIL como sincronización implícita.
Cómo usar `ThreadPoolExecutor` para distribuir trabajo I/O-bound entre un pool de threads, gestionar futures y propagar excepciones correctamente.
Cómo usar `queue.Queue` para el patrón productor-consumidor sin locks manuales, incluyendo `task_done()`, `join()` y las variantes `LifoQueue` y `PriorityQueue`.
Primitivas de threading para proteger estado compartido, señalizar entre threads y coordinar patrones producer-consumer sin deadlocks.
Cómo y cuándo usar `threading.Thread` en Python para operaciones I/O-bound, aprovechando la liberación del GIL durante llamadas bloqueantes.
El GIL es un mutex global que serializa la ejecución de bytecode para proteger el reference counting; permite paralelismo real en I/O-bound pero bloquea el CPU-bound.
Cómo usar `__init_subclass__` para registrar, validar y parametrizar subclases sin escribir una metaclase, y cuándo todavía la necesitas.
Cómo `type` fabrica clases en Python, cómo interceptar ese proceso con metaclases propias y cuándo `__init_subclass__` o decoradores son la opción más sensata.
Cómo implementar el protocolo descriptor (__get__, __set__, __delete__) para construir validadores, lazy properties y entender cómo funcionan los ORMs internamente.