Multihilo en Node.js

Waqar Aslam 12 octubre 2023
Multihilo en Node.js

En Node.js, el término “multiproceso” no se aplica porque Node.js está diseñado para ejecutarse en un bucle de eventos de un solo subproceso. Sin embargo, Node.js se basa en el lenguaje JavaScript, que tiene un solo subproceso de forma predeterminada.

Sin embargo, Node.js proporciona algunas formas de realizar tareas de programación simultáneas. Una forma de hacerlo es mediante el módulo child_process, que le permite generar nuevos procesos que pueden ejecutarse simultáneamente con el proceso principal de Node.js.

Otra forma de realizar tareas simultáneas en Node.js es usar la sintaxis async/await, que le permite escribir código asíncrono que parece que es síncrono. Esto puede facilitar la escritura de código que realiza varias tareas al mismo tiempo sin tener que generar nuevos procesos de forma explícita o utilizar devoluciones de llamada.

Por ejemplo, el siguiente código usa async/await para realizar dos tareas al mismo tiempo.

async function runTasks() {
  const task1 = doTask1();
  const task2 = doTask2();

  await Promise.all([task1, task2]);
}

En este ejemplo, doTask1 y doTask2 son funciones asíncronas que devuelven Promises. El operador esperar se usa para esperar a que ambas Promesas se resuelvan antes de continuar.

Esto permite que las dos tareas se realicen simultáneamente en lugar de secuencialmente. Vale la pena señalar que la sintaxis async/await se basa en el tipo Promise de JavaScript, lo que le permite escribir código asíncrono de una manera que se parece más al código síncrono tradicional.

El módulo child_process en Node.js proporciona una manera fácil de generar nuevos procesos. Le permite ejecutar programas externos, como scripts Bash u otros ejecutables, desde un programa Node.js.

Implementar subprocesos múltiples en Node.js

Aquí hay un ejemplo del uso del módulo child_process para ejecutar un script Bash.

En este ejemplo, la función exec se usa para ejecutar un script Bash llamado bash_script.sh. La función recibe una devolución de llamada que se llama cuando finaliza el proceso.

La devolución de llamada recibe tres argumentos: error, stdout y stderr. Estos argumentos contienen el error que ocurrió, la salida estándar del proceso y el error estándar del proceso, respectivamente.

El módulo child_process proporciona varias otras funciones para generar procesos, como spawn, fork y execFile. Cada una de estas funciones tiene su propio conjunto de opciones y comportamiento, por lo que puede elegir la que mejor se adapte a sus necesidades.

const {exec} = require('child_process');

exec('bash_script.sh', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log(`Script run successfully`);
});

Producción :

stdout:
stderr:
Script run successfully
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn