Programación multi-hilo en NodeJS: ¡Castiga a ese procesador!


Ok, me emocioné... jaja

Para todos aquellos que no lo sepan, (en muchos casos) por defecto NodeJS sólo utiliza 1 sólo núcleo (y proceso) aún en una computadora con multi-cores disponibles. Esto quiere decir que (en algunos casos) si corres un programa/aplicación NodeJS en una computadora con 2 o más núcleos en procesador (o en un clúster con varios a la mano pues) NodeJS no aprovechará por defecto toda la capacidad de cómputo que tenga disponible.

Para la mayoría de aplicaciones e implementaciones esto no suele ser relevante, (sobretodo si hablamos de scripting donde en muchos casos aunque NodeJS inicie un sólo proceso éste puede llegar a usar todos los cores dependiendo de para qué esté diseñado el script en cuestión).

Sin embargo, si vas a procesar grandes cantidades de datos a través de un script/app de NodeJS, deberías considerar hacer programación multi-hilo (que aproveche todos los núcleos disponibles y lance diferentes procesos por núcleo) en dicho caso... Lo mismo si el rendimiento es importante para ti y ves que tu aplicación está corriendo actualmente a un sólo núcleo (como es común en servidores HTTP creados con NodeJS y respectivamente en web frameworks como ExpressJS por ejemplo).

Y a todo esto, ¿Cómo se hace?

Sencillo. Se utiliza el módulo cluster de NodeJS:

npm install cluster

Y su uso es bastante sencillo, veamos el ejemplo:

monocore.coffee

Este script funciona únicamente con un sólo núcleo, y el resultado de ejecutarlo es el siguiente:


Para hacerlo multi-hilo, tenemos que adaptarlo así:

multicore.coffee

Y el resultado de ejecutar la nueva versión sería:


Como verán, el primer script llena un sólo núcleo de nuestro procesador con la tarea a realizar mientras el otro se mantiene libre de presión alguna. En cuanto clusterizamos nuestro script el proceso se hace multi-hilo y entonces empezamos a usar todos los cores disponibles en la máquina (en el caso de mi ejemplo 2), abriendo un proceso nuevo de node por c/u también (más aparte uno extra que corresponde al proceso del clústering):