Sincronización entre threads: Lock, RLock, Event y Condition
Primitivas de threading para proteger estado compartido, señalizar entre threads y coordinar patrones producer-consumer sin deadlocks.
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.
Comparativa práctica de los tres principales type checkers de Python, configuración progresiva de strictness y su integración en CI.
Cómo definir interfaces por estructura con Protocol, sin herencia explícita, verificadas estáticamente y opcionalmente en runtime.