window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versión: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster ya existe') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Asíncrono y monohilo JavaScript? - The Codest
The Codest
  • Quiénes somos
  • Servicios
    • Desarrollo de software
      • Desarrollo Frontend
      • Desarrollo backend
    • Staff Augmentation
      • Desarrolladores frontales
      • Desarrolladores de backend
      • Ingenieros de datos
      • Ingenieros de la nube
      • Ingenieros de control de calidad
      • Otros
    • Asesoramiento
      • Auditoría y consultoría
  • Industrias
    • Fintech y Banca
    • E-commerce
    • Adtech
    • Tecnología sanitaria
    • Fabricación
    • Logística
    • Automoción
    • IOT
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • Nuestro equipo
  • Case Studies
  • Saber cómo
    • Blog
    • Meetups
    • Seminarios en línea
    • Recursos
Carreras profesionales Póngase en contacto
  • Quiénes somos
  • Servicios
    • Desarrollo de software
      • Desarrollo Frontend
      • Desarrollo backend
    • Staff Augmentation
      • Desarrolladores frontales
      • Desarrolladores de backend
      • Ingenieros de datos
      • Ingenieros de la nube
      • Ingenieros de control de calidad
      • Otros
    • Asesoramiento
      • Auditoría y consultoría
  • Valor para
    • CEO
    • CTO
    • Gestor de entregas
  • Nuestro equipo
  • Case Studies
  • Saber cómo
    • Blog
    • Meetups
    • Seminarios en línea
    • Recursos
Carreras profesionales Póngase en contacto
Flecha atrás VOLVER
2020-03-31
Desarrollo de software

Asíncrono y monohilo JavaScript?

Lukasz Kolko

JavaScript es un lenguaje monohilo y, al mismo tiempo, también no bloqueante, asíncrono y concurrente. Este artículo le explicará cómo sucede.

  • Tiempo de ejecución

JavaScript es un lenguaje interpretado, no compilado. Esto significa que necesita un intérprete que convierta el lenguaje JS código a un código máquina. Existen varios tipos de intérpretes (conocidos como motores). Los más populares son V8 (Chrome), Quantum (Firefox) y WebKit (Safari). Por cierto, V8 también se utiliza en un popular runtime que no es de navegador, Node.js.

Cada motor contiene un montón de memoria, una pila de llamadas, un bucle de eventos, una cola de retrollamadas y una WebAPI con peticiones HTTP, temporizadores, eventos, etc., todo implementado a su manera para una interpretación más rápida y segura del código JS.

JavaScript desarrollo

Arquitectura básica de ejecución JS. Autor: Alex Zlatkov

Hilo único

Un lenguaje monohilo es aquel que tiene una única pila de llamadas y un único montón de memoria. Esto significa que sólo ejecuta una cosa a la vez.

A pila es una región continua de memoria, que asigna un contexto local para cada función ejecutada.

A montón es una región mucho mayor, que almacena todo lo asignado dinámicamente.

A pila de llamadas es una estructura de datos que básicamente registra dónde nos encontramos en el programa.

Pila de llamadas

Escribamos un código sencillo y sigamos lo que ocurre en la pila de llamadas.

JavaScript desarrollo de software

Como puede ver, las funciones se añaden a la pila, se ejecutan y posteriormente se eliminan. Es el llamado modo LIFO - Last In, First Out (último en entrar, primero en salir). Cada entrada de la pila de llamadas se denomina marco de pila.

El conocimiento de la pila de llamadas es útil para leer las trazas de la pila de errores. Generalmente, el motivo exacto del error se encuentra en la parte superior de la primera línea, aunque el orden de ejecución del código es ascendente.

A veces se puede tratar de un error popular, notificado por Se ha superado el tamaño máximo de la pila de llamadas. Es fácil conseguirlo utilizando la recursividad:

function foo() {
    foo()
}
foo()

y nuestro navegador o terminal se congela. Cada navegador, incluso sus diferentes versiones, tiene un límite de tamaño de pila de llamadas diferente. En la gran mayoría de los casos, son suficientes y el problema debe buscarse en otro sitio.

Pila de llamadas bloqueada

He aquí un ejemplo de bloqueo del hilo JS. Intentemos leer un foo y un archivo bar utilizando el Nodo.js función sincrónica readFileSync.

Código JavaScript

Este es un GIF en bucle. Como ves, el motor JS espera hasta la primera llamada en readFileSync se ha completado. Pero esto no sucederá porque no hay foo por lo que nunca se llamará a la segunda función.

Comportamiento asíncrono

Sin embargo, JS también puede ser no-bloqueante y comportarse como si fuera multi-hilo. Esto significa que no espera la respuesta de una llamada a la API, eventos de E/S, etc., y puede continuar la ejecución del código. Esto es posible gracias a los motores JS que utilizan (bajo el capó) lenguajes multihilo reales, como C++ (Chrome) o Rust (Firefox). Ellos nos proporcionan la API Web bajo las capuchas de los navegadores o ex. I/O API bajo Node.js.

Lenguaje de programación JavaScript

En el GIF anterior, podemos ver que la primera función es empujada a la pila de llamadas y Hola se ejecuta inmediatamente en la consola.

A continuación, llamamos al setTimeout proporcionada por la WebAPI del navegador. Va a la pila de llamadas y su devolución de llamada asíncrona foo va a la cola de WebApi, donde espera la llamada, programada para que ocurra después de 3 segundos.

Mientras tanto, el programa continúa el código y vemos Hola. No estoy bloqueado en la consola.

Una vez invocada, cada función de la cola WebAPI pasa a la carpeta Cola de devolución de llamada. Es donde las funciones esperan hasta que la pila de llamadas está vacía. Cuando esto ocurre, se mueven allí una a una.

Así, cuando nuestro setTimeout termina la cuenta atrás, nuestro foo va a la cola de retrollamadas, espera hasta que la pila de llamadas esté disponible, va allí, se ejecuta y vemos Hola desde callback asíncrono en la consola.

Bucle de eventos

La pregunta es, ¿cómo sabe el tiempo de ejecución que la pila de llamadas está vacía y cómo se invoca el evento en la cola de devolución de llamada? Conoce el bucle de eventos. Forma parte del motor JS. Este proceso comprueba constantemente si la pila de llamadas está vacía y, si lo está, controla si hay un evento en la cola de llamadas de retorno esperando a ser invocado.

Así es la magia entre bastidores.

Recapitulación de la teoría

Concurrencia y paralelismo

Concurrencia significa ejecutar varias tareas al mismo tiempo, pero no simultáneamente. Por ejemplo, dos tareas funcionan en periodos de tiempo que se solapan.

Paralelismo significa realizar dos o más tareas simultáneamente, por ejemplo, realizar varios cálculos al mismo tiempo.

Hilos y procesos

Hilos son una secuencia de ejecución de código que pueden ejecutarse independientemente unas de otras.

Proceso es una instancia de un programa en ejecución. Un programa puede tener varios procesos.

Sincrónico y asincrónico

En síncrono programación, las tareas se ejecutan una tras otra. Cada tarea espera a que se complete cualquier tarea anterior y se ejecuta solo entonces.

En asíncrono programación, cuando se ejecuta una tarea, puede cambiar a otra distinta sin esperar a que finalice la anterior.

Sincrónico y asincrónico en un entorno monohilo y multihilo

Sincrónico con un único hilo: Las tareas se ejecutan una tras otra. Cada tarea espera a que se ejecute la anterior.

Sincrónico con múltiples hilos: Las tareas se ejecutan en diferentes hilos pero esperan a que se ejecute cualquier otra tarea en cualquier otro hilo.

Asíncrono con un único hilo: Las tareas comienzan a ejecutarse sin esperar a que termine otra tarea. En un momento dado, sólo puede ejecutarse una única tarea.

Asíncrono con múltiples hilos: Las tareas se ejecutan en diferentes hilos sin esperar a que se completen otras tareas y terminan sus ejecuciones de forma independiente.

Clasificación JavaScript

Si consideramos cómo funcionan los motores JS bajo el capó, podemos clasificar JS como un lenguaje interpretado asíncrono y de un solo hilo. La palabra "interpretado" es muy importante porque significa que el lenguaje siempre dependerá del tiempo de ejecución y nunca será tan rápido como los lenguajes compilados con multihilo incorporado.

Cabe destacar que Node.js puede conseguir un multihilo real, siempre que cada hilo se inicie como un proceso independiente. Existen librerías para ello, pero Node.js incorpora una función llamada Hilos de trabajo.

Todos los GIF del bucle de eventos proceden del Lupa creada por Philip Roberts, donde puedes probar tus escenarios asíncronos.

Más información:

¿Por qué debería (probablemente) utilizar Typescript?

La calidad ante todo 5 sencillos pasos para eliminar la pelusa de su código con flujos de trabajo de GitHub en el proyecto JavaScript

¿Cómo mejorar las aplicaciones Vue.js? Algunos consejos prácticos

Artículos relacionados

Desarrollo de software

Crear aplicaciones web preparadas para el futuro: ideas del equipo de expertos de The Codest

Descubra cómo The Codest destaca en la creación de aplicaciones web escalables e interactivas con tecnologías de vanguardia, ofreciendo experiencias de usuario fluidas en todas las plataformas. Descubra cómo nuestra experiencia impulsa la transformación...

EL MEJOR
Desarrollo de software

Las 10 mejores empresas de desarrollo de software de Letonia

Conozca las principales empresas de desarrollo de software de Letonia y sus innovadoras soluciones en nuestro último artículo. Descubra cómo estos líderes tecnológicos pueden ayudarle a mejorar su negocio.

thecodest
Soluciones para empresas y escalas

Fundamentos del desarrollo de software Java: Guía para externalizar con éxito

Explore esta guía esencial sobre el desarrollo de software Java outsourcing con éxito para mejorar la eficiencia, acceder a la experiencia e impulsar el éxito de los proyectos con The Codest.

thecodest
Desarrollo de software

La guía definitiva para subcontratar en Polonia

El auge de las outsourcing en Polonia está impulsado por los avances económicos, educativos y tecnológicos, que fomentan el crecimiento de las TI y un clima favorable a las empresas.

TheCodest
Soluciones para empresas y escalas

Guía completa de herramientas y técnicas de auditoría informática

Las auditorías informáticas garantizan sistemas seguros, eficientes y conformes. Obtenga más información sobre su importancia leyendo el artículo completo.

The Codest
Jakub Jakubowicz CTO y Cofundador

Suscríbase a nuestra base de conocimientos y manténgase al día de la experiencia del sector informático.

    Quiénes somos

    The Codest - Empresa internacional de desarrollo de software con centros tecnológicos en Polonia.

    Reino Unido - Sede central

    • Oficina 303B, 182-184 High Street North E6 2JA
      Londres, Inglaterra

    Polonia - Centros tecnológicos locales

    • Parque de oficinas Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Embajada del Cerebro, Konstruktorska
      11, 02-673 Varsovia, Polonia

      The Codest

    • Inicio
    • Quiénes somos
    • Servicios
    • Case Studies
    • Saber cómo
    • Carreras profesionales
    • Diccionario

      Servicios

    • Asesoramiento
    • Desarrollo de software
    • Desarrollo backend
    • Desarrollo Frontend
    • Staff Augmentation
    • Desarrolladores de backend
    • Ingenieros de la nube
    • Ingenieros de datos
    • Otros
    • Ingenieros de control de calidad

      Recursos

    • Hechos y mitos sobre la cooperación con un socio externo de desarrollo de software
    • De EE.UU. a Europa: ¿Por qué las startups estadounidenses deciden trasladarse a Europa?
    • Comparación de los polos de desarrollo de Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filipinas), Eurasia (Turquía)
    • ¿Cuáles son los principales retos de los CTO y los CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condiciones de uso del sitio web

    Copyright © 2025 por The Codest. Todos los derechos reservados.

    es_ESSpanish
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean nl_NLDutch etEstonian elGreek es_ESSpanish