8 - Concurrencia y paralelismo en el mundo real

La concurrencia y el paralelismo sostienen gran parte del software moderno. Desde servidores que atienden millones de peticiones hasta motores de juegos o pipelines de datos, estos conceptos permiten que las aplicaciones sean responsivas, escalen y aprovechen el hardware disponible. A continuación se muestran ejemplos concretos de cómo se aplican en distintos dominios.

8. Concurrencia y Paralelismo en el Mundo Real

Veremos cinco escenarios donde estos conceptos son imprescindibles, destacando qué se gana y qué retos aparecen en cada caso.

8.1 Aplicaciones en servidores web

Un servidor debe atender miles de clientes sin que una solicitud bloquee a las demás. Los modelos basados en eventos manejan la concurrencia de E/S (lectura/escritura de sockets) con pocos hilos, mientras que hilos o procesos adicionales ejecutan lógica pesada en paralelo.

  • Concurrencia: bucles de eventos asíncronos permiten que cada conexión siga progresando mientras otras esperan datos.
  • Paralelismo: pools de hilos o procesos aprovechan múltiples núcleos para renderizar plantillas, acceder a bases o ejecutar cálculos.
  • Beneficio: mayor throughput y menor latencia percibida por usuario final.
  • Reto: aislar solicitudes para evitar condiciones de carrera y asegurar que los estados de sesión no se corrompan.

8.2 Aplicaciones en videojuegos

Un juego moderno corre ciclos de física, renderizado, audio y lógica de IA en paralelo. Un hilo principal coordina el loop de juego, mientras hilos dedicados ejecutan simulaciones de física o cargan recursos. Las GPUs se ocupan del renderizado masivo de gráficos.

  • Concurrencia: separar tareas (render, física, audio) evita que un componente con retardo congele el juego.
  • Paralelismo: uso intensivo de GPU para gráficos y de CPU multi-core para IA y física.
  • Beneficio: tasa de cuadros estable y menor input lag.
  • Reto: sincronizar estados compartidos (posiciones, colisiones) sin introducir stutters (tirones o microcortes visibles en pantalla).

8.3 Uso en ciencia de datos y simulaciones

Procesar datasets grandes o ejecutar simulaciones numéricas demanda dividir el trabajo. Las bibliotecas paralelizan operaciones vectorizadas, distribuyen tareas en clusters y explotan GPUs para acelerar álgebra lineal.

  • Concurrencia: coordinar etapas de un pipeline (ingesta, limpieza, entrenamiento) para que los datos fluyan sin bloqueos.
  • Paralelismo: dividir matrices o lotes de datos entre núcleos y GPUs para reducir tiempos de cálculo.
  • Beneficio: iteraciones más rápidas sobre modelos y experimentos.
  • Reto: balancear carga entre nodos y gestionar transferencias de datos para evitar cuellos de botella.

8.4 Aplicaciones móviles y UI

En dispositivos móviles, la UI debe mantenerse fluida mientras se realizan descargas, consultas a APIs o procesamientos de medios. La concurrencia evita bloqueos en el hilo principal; el paralelismo se usa cuando hay núcleos adicionales disponibles.

  • Concurrencia: tareas de red, acceso a disco y animaciones se orquestan para que la interfaz nunca se congele.
  • Paralelismo: decodificación de video, filtros de imagen o procesamiento de audio se reparten entre núcleos.
  • Beneficio: mejor experiencia de usuario, animaciones suaves y respuestas rápidas.
  • Reto: respetar límites de batería y termales, y sincronizar actualizaciones de UI desde hilos de fondo.

8.5 Sistemas distribuidos y microservicios

En arquitecturas distribuidas, cada servicio maneja concurrencia internamente y a la vez coordina mensajes con otros servicios. El paralelismo permite escalar horizontalmente, ejecutando instancias en múltiples nodos o contenedores.

  • Concurrencia: gestión de sockets, colas de mensajes y peticiones simultáneas entre servicios.
  • Paralelismo: instancias replicadas procesan en paralelo peticiones del mismo tipo; tareas pesadas se distribuyen entre nodos.
  • Beneficio: escalabilidad y resiliencia frente a fallos.
  • Reto: mantener consistencia de datos, manejar latencias de red y evitar efectos en cascada ante fallos.

Estos ejemplos muestran que concurrencia y paralelismo son pilares prácticos: mejoran percepción de velocidad, permiten escalar y abren posibilidades de procesamiento que el enfoque secuencial no puede alcanzar.