Node.js es un lenguaje de subproceso único y utiliza varios subprocesos en segundo plano para ciertas tareas como llamadas de E/S, pero no expone los subprocesos secundarios al desarrollador.
Pero node.js nos brinda formas de trabajar si realmente necesitamos hacer algún trabajo en paralelo a nuestro proceso principal de subproceso único.
Proceso secundario en el Node: el módulo child_process le da al Node la capacidad de ejecutar el proceso secundario accediendo a los comandos del sistema operativo.
Ejemplo: Nombre de archivo: paraleloProcess.js
javascript
// Do any work in parallel to main // event loop or main process console.log('Child Process Starts') setTimeout(() => { console.log('Data processed') }, 5000)
Nombre de archivo: principal.js
javascript
const { fork } = require('child_process'); // Fork another process const child_process = fork('./parallelProcess.js'); // Data we may need to send to the child process const data = {} console.log('Before process') // Send the data to forked process child_process.send({ data }, function(){ console.log('Sending data') }); // Listen to forked process child_process.on('close', (result) => { console.log('Child process terminated and returned'); }); console.log('After process')
Producción:
Before process After process Child Process Starts Data processed Child process terminated and returned
Subprocesos de trabajo El módulo worker_threads permite el uso de subprocesos que ejecutan JavaScript en paralelo. Los subprocesos de trabajo son útiles para realizar operaciones de JavaScript con uso intensivo de la CPU. No ayudarán mucho con el trabajo intensivo de E/S que se puede hacer mejor usando las operaciones de E/S asincrónicas integradas de Node.js.
Ejemplo:
javascript
const {Worker, isMainThread, parentPort} = require('worker_threads'); if (isMainThread) { // Main code, only executed for main thread const worker = new Worker(__filename, { workerData: {} }); worker.on('message', (m) => console.log( 'Thread send message:', m)); worker.on('error', () => console.log('Error')); worker.on('exit', () => { console.log('Worker exit') }); } else { // Worker thread code, only execute // for working thread. setTimeout(() => { parentPort.postMessage('Hello World!'); }, 3000) }
Producción:
Thread send message: Hello World! Worker exit
El proceso tiene su propio espacio de memoria, por otro lado, los hilos usan el espacio de memoria compartida. El hilo es parte del proceso. Dado que los hilos de los trabajadores crean nuevos hilos dentro del mismo proceso, requiere menos recursos.
Referencia:
https://nodejs.org/api/child_process.html
https://nodejs.org/api/worker_threads.html