Search code examples
javascriptnode.jschild-processnode-sassnode-cluster

Run two tasks in two different workers using cluster in nodejs


I am learning clustering in NodeJS. I have two tasks one is node-sass and another one is uglifyjs which I want to run by two different workers using cluster in nodeJS. Though the code is working file and creating the SASS -> CSS file and main.js to main.min.js file.

But I am not sure whether it is handled by separate workers or not. Let me know where I can make the amendments to make -

  • SASS -> CSS handled by one worker
  • UglifyJS task by second worker
  • Once both tasks complete Master console a successful message

Following is my code:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
var fs = require('fs');
var UglifyJS = require("uglify-js");
var sass = require('node-sass');

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < 2; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {


var result = UglifyJS.minify("js/main.js");
fs.writeFile(__dirname + '/js/main.min.js', result.code, function(err){
    if(err)
        throw err;
});

sass.render({
  file: './css/main.scss',
  outFile: 'css',
}, function(err, result) { 
    if(err)
        throw err;
    fs.writeFile(__dirname + '/css/main.css', result.css, function(err){
        if(err)
            throw err;
    });
});

  console.log(`Worker ${process.pid} started`);
}

Solution

  • I think this will help

    const cluster = require('cluster');
    const http = require('http');
    const numCPUs = require('os').cpus().length;
    var fs = require('fs');
    var UglifyJS = require("uglify-js");
    var sass = require('node-sass');
    
    if (cluster.isMaster) {
        console.log(`Master ${process.pid} is running`);
        cluster.fork()
            .on('exit', (worker, code, signal) => {
                console.log(`worker ${worker.process.pid} died`);
            });
        cluster.fork()
            .on('exit', (worker, code, signal) => {
                console.log(`worker ${worker.process.pid} died`);
            });
    
    } else if (cluster.worker.id === 1) {
        console.log(`Worker ${process.pid} started`);
        sass.render({
            file: './css/main.scss',
            outFile: 'css',
        }, function (err, result) {
            if (err)
                throw err;
            fs.writeFile(__dirname + '/css/main.css', result.css, function (err) {
                if (err)
                    throw err;
            });
        });
        process.exit();
    } else {
        var result = UglifyJS.minify("js/main.js");
        fs.writeFile(__dirname + '/js/main.min.js', result.code, function (err) {
            if (err)
                throw err;
        });
        process.exit();
    }