Cuando hablamos de programación asíncrona, lo primero que debemos hacer es conocer una serie de términos y “palabros” como asincronía, concurrencia, paralelismo.
Ya había dicho que el mundo de la asincronía es complicado, no os voy a engañar. De hecho el tema daría fácilmente para su propio curso. Lo cuál, lógicamente, no es el propósito de este artículo.
Pero, como programador, sí hay ciertas cosas términos que te deberían sonar. Y ya os adelanto que son palabras muy relacionadas, e incluso podríamos decir que un poco mezcladas e liadas entre sí.
Tranquilos que me pienso poner pesado con la diferencias entre ellas. Al final son palabras. Pero lo que sí es importante es conocer los conceptos y lo que son cada uno de ellos, aunque sea brevemente.
Así que empecemos por lo más básico, el proceso síncrono 👇
Proceso síncrono y bloqueante
Un proceso síncrono y bloqueante es aquel que se ejecuta de forma secuencial, esperando que cada operación finalice antes de comenzar la siguiente.
Es decir, si dentro de tu programa tuvieras dos tareas, “proceso 1” y “proceso 2”. El proceso 2 esperaría a que terminara el proceso 1, y empezaría inmediatamente después de su finalización.
En este caso los proceso son síncronos porque empiezan uno detrás de otro. Además el proceso 1 es bloqueante, porque el proceso 2 no puede empezar hasta que termine su ejecución.
Este tipo de proceso es el primero que vais a aprender. Es el más simple de entender y programar. El de “toda la vida” vamos. Aquí no hay asincronía, ni concurrencia, ni nada de nada.
Concurrencia
La concurrencia se refiere a la capacidad de un sistema para ejecutar múltiples tareas que se solapan en el tiempo. Es decir, que concurren en el tiempo (de ahí viene su nombre).
Por definición, dos tareas son concurrentes si una de ellas empieza entre el inicio y el final de la otra. Por ejemplo así:
Al decir que dos tareas son concurrentes, no hemos dicho nada sobre “cómo” va a ser esa concurrencia, ni como la van a lograrla, ni nada de nada.
Simplemente estamos diciendo que durante un tiempo, se ejecutan ambas. Es decir, literalmente sólo hemos dicho concurren temporalmente.
Paralelismo y semi-paralelismo
Ahora llegamos a paralelismo y semi-paralelismo. Aquí sí estamos hablando de una forma concreta de lograr concurrencia, mediante la ejecución simultánea de múltiples procesos.
Lo primero que hay que recordar es que, en general, un procesador de un núcleo solo puede ejecutar un único proceso de forma simultánea. Así es como son construidos y así es como funcionan.
En el caso de que nuestro procesador tenga varios núcleos, sí podemos realizar paralelismo. Esto significa que cada núcleo puede encargarse de ejecutar uno de los procesos.
Sin embargo, aún cuando nuestro procesador no disponga de múltiples núcleos para ejecutar procesos en paralelo, aún podemos emularlo con semi-paralelismo.
Básicamente, el procesador va cambiando de tarea en tarea, dedicando tiempo a cada uno de ellos. De este reparto de tiempo y la gestión de las tareas se encarga el Sistema Operativo.
De esta forma, se crea una ilusión de que ambos se ejecutan simultáneamente.
Lógicamente, con el paralelismo se reducen los tiempos globales de procesado. Si tienes dos núcleos (imaginemos que igual de potentes que si estuviera sólo), el tiempo de proceso va a ser más pequeño.
Pero incluso en el caso de semi-paralelismo, con un único núcleo, los tiempos de procesado pueden reducirse. Esto es así porque muchas veces los procesos tienen esperas.
En ese caso, el proceso 1 tiene una espera. El semi-paralelismo permite que el procesador meta en medio el proceso 2 (o una parte del mismo). Con lo cuál, eso que te llevas.
Asincronía
Por fin llegamos a la asincronía. Un proceso asíncrono es un proceso que no es síncrono (y me quedao tan pancho). Como vemos, es un termino demasiado amplio.
La concurrencia tiene que ver con asincronía, y el paralelismo, y el semi-paralelismo. Todo está más o menos relacionado y todo es asincronía en último término.
Pero, en general, normalmente solemos llamar a un proceso “asíncrono” cuando tenemos un proceso que supone una espera o un bloqueo muy largo. Por ejemplo, esperar a que un usurio pulse una tecla, a que se lea un fichero, o a recibir una comunicación.
Para que esos procesos no bloqueen el flujo de programa principal se lanzan con un mecanismo de concurrencia para que no sean bloqueantes. Entonces se suele decir que se han lanzado de forma asíncrona.
Definición formal
Ahora que ya hemos visto los distintos términos, vamos a por una definición un pelin más rigurosa de lo que es cada uno de ellos.
Asincronía
Modelo de ejecución en el que las operaciones no bloquean el flujo del programa y pueden ejecutarse de forma no secuencial
Concurrencia
La capacidad de un sistema para gestionar múltiples tareas que se solapan (concurren) en el tiempo
Paralelismo
Ejecución de múltiples procesos en distintos núcleos de un procesador, permitiendo un verdadero procesamiento simultáneo.
Semi-Paralelismo
Paralelismo “simulado” dentro del mismo núcleo, que se realiza activando y pausando tareas, y dedicándoles tiempo de procesador de forma alterna.
Como hemos visto, son términos que son más o menos sencillos, pero están relacionados (y mezclados entre ellos). Lo dicho, más importante que las palabras y la definición formal, lo importante es saber lo que son y entender su funcionamiento.