Python ofrece tres modelos de concurrencia, y elegir correctamente depende sobre todo de si tu trabajo está limitado por I/O o limitado por CPU, una decisión muy condicionada por el GIL (que impide que los hilos ejecuten código Python en paralelo).
Los tres modelos
threading → multiple threads, ONE process. GIL-limited for CPU.
multiprocessing → multiple PROCESSES, each its own interpreter/GIL → true parallelism.
asyncio → single thread, cooperative coroutines yielding at await points.
