El Trampa de Tokio/Rayón y por qué Async/Await Fallía la Concurrency
La programación asíncrona con async/await ha ganado popularidad en la última década debido a su facilidad de uso. Sin embargo, bajo su sintaxis familiar se esconde una complejidad estructural masiva que puede llevar a problemas de concurrencia.
Algunos hechos clave sobre este tema son: * Async/await es fácil de escribir pero complejo de operar. * La sintaxis de async/await puede confundir asincronía con concurrencia. * Los ejecutores cooperativos pueden detenerse cuando se ejecutan tareas intensivas en CPU. * La separación de runtimes para I/O y cálculos intensivos en CPU puede ser necesaria. * Los sistemas asíncronos pueden consumir demasiada memoria si no se limita la capacidad.
“* Los sistemas asíncronos pueden consumir demasiada memoria si no se limita la capacidad”
La confusión entre asincronía y concurrencia es un problema fundamental con async/await. La sintaxis puede hacer que los desarrolladores escriban código asíncrono como si fuera código síncrono, lo que puede llevar a problemas de concurrencia. Por ejemplo, si un desarrollador escribe una función asíncrona que fetcha un registro de base de datos y luego lo procesa, puede parecer que el código es asíncrono, pero en realidad, el ejecutor cooperativo puede detenerse si la tarea de procesamiento es intensiva en CPU.
La separación de runtimes para I/O y cálculos intensivos en CPU puede ser necesaria para evitar problemas de concurrencia. Sin embargo, esto puede agregar complejidad adicional al código, ya que los desarrolladores deben analizar cada función para decidir si pertenece al "pool de I/O" o al "pool de cálculo" y luego manualmente orquestar el paso de mensajes entre ellos.
En resumen, aunque async/await es fácil de usar, puede llevar a problemas de concurrencia si no se utiliza con cuidado. Los desarrolladores deben ser conscientes de los límites de la asincronía y tomar medidas para evitar problemas de concurrencia, como separar runtimes para I/O y cálculos intensivos en CPU. La capacidad de los sistemas asíncronos también debe ser limitada para evitar consumir demasiada memoria y causar errores de memoria insuficiente.