Una Coroutine es una función o rutina que permite la ejecución cooperativa y no preemptiva. A diferencia de los hilos del sistema operativo (OS threads), que son gestionados por el scheduler del kernel y pueden ser preemptidos en cualquier momento, las corutinas ceden explícitamente el control. Esto significa que una corutina se ejecuta hasta que "yields" (cede) el control a otra corutina o al scheduler de corutinas, o hasta que finaliza. Mantienen su propio estado de ejecución (stack, registros) entre las operaciones de pausa y reanudación, lo que las hace muy eficientes para tareas de E/S intensivas o computación concurrente ligera.
Las corutinas se implementan en una variedad de lenguajes y frameworks para manejar la concurrencia de manera eficiente. Ejemplos notables incluyen Kotlin Coroutines, que proporcionan una forma idiomática de escribir código asíncrono y concurrente; Python con sus palabras clave `async`/`await` y la librería `asyncio`; C# con `async`/`await`; y Go con sus "goroutines", que son una forma de corutinas multiplexadas sobre hilos del sistema operativo. También son fundamentales en frameworks de E/S asíncrona como Netty en Java o Nginx para manejar miles de conexiones concurrentes con un número limitado de hilos.
Para un arquitecto, las corutinas son cruciales para diseñar sistemas de alta concurrencia y rendimiento. Ofrecen una alternativa ligera a los hilos tradicionales, reduciendo la sobrecarga de cambio de contexto y el consumo de memoria, lo que permite escalar a un mayor número de operaciones concurrentes. Sin embargo, su naturaleza cooperativa requiere una cuidadosa consideración para evitar "starvation" (inanición) si una corutina bloquea el "event loop" o el scheduler de corutinas. La elección entre corutinas, hilos o una combinación (como en Go) depende de la naturaleza de la carga de trabajo (CPU-bound vs. I/O-bound), los requisitos de latencia y el modelo de programación preferido. Entender las corutinas permite diseñar arquitecturas reactivas y resilientes, optimizando el uso de recursos y mejorando la capacidad de respuesta del sistema.