Spawn es un comando diseñado para ejecutar comandos del sistema. Cuando ejecuta spawn, le envía un comando del sistema que se ejecutará en su propio proceso, pero no ejecuta ningún código adicional dentro de su proceso de nodo. Puede agregar oyentes para el proceso que ha generado, para permitir que su código interactúe con el proceso generado, pero no se crea una nueva instancia de V8 (a menos, por supuesto, que su comando sea otro comando Node, ¡pero en este caso debe usar fork!) Y solo una copia de su módulo de nodo está activa en el procesador.
Fork es una instancia especial de spawn, que ejecuta una nueva instancia del motor V8. Es decir, esencialmente puede crear múltiples trabajadores, ejecutándose exactamente en la misma base de código de Nodo, o tal vez un módulo diferente para una tarea específica. Esto es más útil para crear un grupo de trabajadores. Si bien el modelo de evento asíncrono de nodo permite que un solo núcleo de una máquina se use de manera bastante eficiente, no permite que un proceso de nodo utilice máquinas de múltiples núcleos. La forma más fácil de lograr esto es ejecutar múltiples copias del mismo programa, en un solo procesador.
Una buena regla general es uno o dos procesos de nodo por núcleo, tal vez más para máquinas con una buena relación de reloj ram / CPU, o para procesos de nodo pesados en E / S y poco trabajo de CPU, para minimizar el tiempo de inactividad del evento loop está esperando nuevos eventos. Sin embargo, la última sugerencia es una microoptimización y necesitaría una evaluación comparativa cuidadosa para garantizar que su situación se adapte a la necesidad de muchos procesos / núcleos. En realidad, puede disminuir el rendimiento generando demasiados trabajadores para su máquina / escenario.
En última instancia, podría usar spawn de una manera que hizo lo anterior, enviando a spawn un comando Node. Pero esto sería una tontería, porque fork hace algunas cosas para optimizar el proceso de creación de instancias de V8. Simplemente dejándolo claro, ese engendro en última instancia abarca tenedor. La horquilla es óptima para este caso de uso particular y muy útil.
http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
var child = require('child_process').fork('child.js');
por ejemplo, en mi aplicación principal, ahora tendré 2 núcleos separados ejecutándose. Si tuviera que ejecutar un ciclo for pesado en el proceso child.js, esencialmente estaría utilizando más núcleos para alimentar child.js, ¿verdad? ¿Sin embargo, el uso de la CPU afectaría el núcleo principal de mi aplicación?