Secuencia, concurrencia y paralelismo

Mauricio Garcia
5 min readOct 29, 2022

--

i. Introducción

En la story de JavaScript — Cómo funciona el Runtime Environment — JRE)[ref] mencioné que:

JavaScript es un lenguaje donde su código se ejecuta en un solo hilo, esto quiere decir que solo va a suceder una cosa a la vez (puede ser una tarea o fragmento de código)

Es decir:

  • El motor de JavaScript ejecuta el código de manera ordenada, secuencial y síncrona.
  • Con las Web APIs, JS ejecuta el código de manera concurrente y asíncrona con la limitante de un solo hilo.
  • Con las Web Workers, JS ejecuta el código de manera paralela y asíncrona, es decir ejecuta tareas en un hilo en segundo plano SIN afectar el hilo principal.

He mencionado 3 conceptos clave: secuencial, concurrente y paralela, veamos que es cada una de ellas…

ii.Secuencial

Ejecutar una tarea, donde una vez terminada se ejecuta la siguiente.

Si una operación o tarea falla podrá afectar a todas las dependientes.

— Ejemplo

Veamos un ejemplo con el juego de póker.

Sabemos que la baraja de póker está formada por 52 naipes. En una partida pueden jugar de dos a siete jugadores, siempre de manera individual. En el juego clásico draw poker se reparten 5 cartas.

Ahora, imagina que estas en una mesa con 4 jugadores donde tú serás el encargado de repartir las cartas (crupier)…

Si queremos repartir de forma secuencial, deberás repartir uno a uno sus 5 cartas, es decir, NO podrás pasar al siguiente jugador hasta que tenga sus cartas completas.

— Ejemplo 2

En el código anterior es un buen ejemplo de un código secuencial síncrono, ya que:

  • La línea 1 imprime en consola Hola
  • La línea 4 Imprime en consola x del 0 al 100 y hasta que esta termine…
  • La línea 7 imprime en consola Mundo!!
  • La línea 9Imprime en consola y del 0 al 10 y hasta que esta termine…
  • La línea 13 imprime en consola Adiós!!

iii. Concurrencia

Ejecutar varias tareas mediante periodos de tiempo supuestos y no uno tras otro o dicho de otra manera es tratar con muchas cosas al mismo tiempo.

La simultaneidad puede darnos la ilusión de paralelismo, ya que ambos procesos o tareas hacen un progreso CASI idénticos , aunque en realidad solo ocurre UNA tarea en un momento dado.

Debemos de tener cuidado ya que todavía se puede correr el riesgo de que una de ellas pueda entorpecer el progreso de la otra.

— Ejemplo

Continuando con el ejemplo del póker…

Si queremos repartir de forma concurrente, deberás dar al menos una carta por usuario, hasta completar 5 a cada uno, es decir, cada uno de los usuarios va a recibir cartas pero NO de forma simultánea (es imposible) y tampoco secuencialmente ya que puedes seleccionar el orden.

— Ejemplo 2

En el código anterior es un buen ejemplo de un código concurrente síncrono (recuerda que JS se ejecuta en un solo hilo), ya que:

  • La línea 1 imprime en consola Hello!
  • Con la web APIs la línea 3 y 7 serán enviadas al callback queue
  • La línea 12 imprime en consola Hello for!! x del 0 al 5 y hasta que esta termine…
  • La línea 15 imprime en consola Goodbye!!
  • Una vez que ya no hay código síncrono, JS regresa lo que hay en Job queue y posteriormente lo que hay en callback queue

Quizás con la siguiente imagen quede un poco mas claro:

Recuerda : Cuando el motor de JavaScript no tiene tareas, event loop le va a dar prioridad al componente de Job queue (al resultado de funciones asíncronas) y después al callback queue.

iv. Paralelismo

Ejecutar varias tareas simultáneamente o dicho de otra manera hacer muchas cosas al mismo tiempo.

Cada uno de los procesos o tareas avanzarán a un ritmo independiente entre sí, por lo que cualquier falla quedará aislada, así que el éxito o fracaso de cada una NO afectará a la otra.

— Ejemplo

Continuando con el ejemplo del póker…

Si queremos repartir de forma paralela, deberás abrir otra mesa y conseguirte un compañero que te ayude a repartir cartas, y con esto tener dos juegos en paralelo.

Lo interesante es que se pueden repartir las cartas de manera independiente entre sí, es decir hacerlo de forma secuencial o concurrente.

Veamos:

O uno puede ser secuencial y el otro concurrente.

El ejemplo de paralelismo lo vamos a ver en Web Workers (es el siguiente tema).

Entonces, JavaScript es un lenguaje concurrente, donde su código se ejecuta en un solo hilo, esto quiere decir que solo va a suceder una cosa a la vez (puede ser una tarea o fragmento de código), donde usa el modelo asíncrono concurrente gracias a las Web APIs y modelo asíncrono paralelo gracias a las Web Workers

En la siguiente entrega vamos a ver Web Workers —

--

--