CONCURRENCIA Es cuando 2 o más procesos pueden empezar, correr, y completarse en periodos compartidos de tiempo. No necesariamente significa que van a correr al mismo tiempo, puede correr uno primero, luego el otro hasta que terminan y cambiar quien se ejecuta hasta que terminen.
Esto es lo que pase cuando por ejemplo corres varios procesos cuando tienes 1 core en tu procesador
CONCURRENCIA Puedes agregando otro gopher con una carretilla, ahora los 2 van a estar trabajando concurrentemente.
Pero esto nos trae otro problema, digamos que los gophers solo pueden usar la pila de libros y el incinerador uno a la vez. Por lo tanto es posible que se hagan colas y uno gopher espere al otro para poder usar uno de los recursos.
EVENT-LOOP Y allí acaba nuestra introducción a los conceptos de concurrencia y paralelismo. Estos conceptos sin independientes del lenguaje que usemos. Ahora vamos con algo un poco mas especifico a lenguajes, lenguajes como JavaScript
JavaScript es single threaded, lo que significa que solo puede ejecutar 1 sola cosa a la vez. Es un lenguaje que maneja concurrencia usando un event loop. JavaScript siempre ejecuta el código hasta que se complete, nunca deja nada a medias.
El event loop de javascript, es que el que se encarga de pasar eventos del Callback stack al call stack. Si se los explico así probablemente no lo entiendan, así que vamos a explicar todo lo que tiene en teoría un runtime de JavaScript
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); Vamos a poner un poco de código para ver como funciona,
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); Primero el compilador evaluar todo el código
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); Vamos a poner un poco de código para ver como funciona,
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); Luego cuando consegui una funcion para ejecutar, la ejecuta
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); printHello y va llenando el call stack
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); printHello Vamos a poner un poco de código para ver como funciona,
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); printHello print Vamos a poner un poco de código para ver como funciona,
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); printHello print console.log Vamos a poner un poco de código para ver como funciona,
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } printHello(); printHello print console.log En este momento, ya que la primera función del stack puede retornar, empezamos a sacar elementos del call stack, recuerden que el ultimo que entra es el primero que sale
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } setTimeout( printHello, 5000 ); Ahora vamos a ver como se comporta con un Web API, setTimeout. setTimeout es un API que nos da timers, acepta como primer parámetro una función, que llamamos callback, y como segundo parámetro un entero que es el tiempo del timer en millisegundos.
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } setTimeout( printHello, 5000 ); printHello Cuando el tiempo pasa, el API pone el function en el callback stack
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } setTimeout( printHello, 5000 ); printHello Luego el event loop, en la siguiente iteracion, ve que tiene una función en el callback stack y lo que hace es moverla al Call stack
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code function print(text) { console.log(text); } function printHello() { print("Hello GDLJS"); } setTimeout( printHello, 5000 ); printHello print Luego continua la ejecución como antes
EVENT-LOOP + FRIENDS Call Stack Web APIs Callback Stack Code setTimeout(printHello, 5000 ); setTimeout(printBye, 2000 ); function printBye() { log("Bye GDLJS"); } function printHello() { log("Hello GDLJS"); } function log(t) { console.log(t); } Ahora que pasa si tenemos esto, esto lo vamos a ver en el siguiente link.
PARALELISMO EN JS La forma en que JS puede procesar cosas en paralelo, es levantando varios procesos y sincronizando entre otros procesos. Así que no, no van a ver una solución mágica, es un problema del lenguaje.
La forma en que JS puede procesar cosas en paralelo, es levantando varios procesos y sincronizando entre otros procesos. Así que no, no van a ver una solución mágica, es un problema del lenguaje.
PARALELISMO EN GO La manera en que Go maneja concurrencia, es usando Go routines, Goroutines son como unos lightweight threads, que se multiplexean en los threads del OS. Son bastante baratos, un Goroutine cuesta alrededor de 5kb en memoria.
La manera en que Go maneja concurrencia, es usando Go routines, Goroutines son unos weight threads, que se multiplexean en los threads del OS. Son bastante baratos, un Goroutine cuesta alrededor de 5kb en memoria.