`ThreadPoolExecutor`: la API de alto nivel para threads
Cómo usar `ThreadPoolExecutor` para distribuir trabajo I/O-bound entre un pool de threads, gestionar futures y propagar excepciones correctamente.
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.
Cuándo Python invoca cada uno, por qué `__getattribute__` sin `super()` causa recursión infinita y cómo elegir el correcto según tu caso de uso.
Cómo inspeccionar y modificar objetos en runtime usando las funciones de introspección de Python, con casos reales de serialización y configuración dinámica.