From 42aa0582274b0263acdacdc3cf0f51a925af80df Mon Sep 17 00:00:00 2001 From: Vladyslav Dukhin Date: Wed, 5 Apr 2017 02:08:39 +0300 Subject: [PATCH] Moved examples from cluster to child_process Closes HowProgrammingWorks/InterProcessCommunication#3 --- workers/master.js | 40 ---------------------------------------- workers/multicore.js | 41 ++++++++++++++++++++++++++++++++++++----- workers/worker.js | 24 ++++++++++-------------- 3 files changed, 46 insertions(+), 59 deletions(-) delete mode 100644 workers/master.js diff --git a/workers/master.js b/workers/master.js deleted file mode 100644 index 6e2f08e..0000000 --- a/workers/master.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -module.exports = () => { - - const cpuCount = api.os.cpus().length; - - const workers = []; - for (let i = 0; i < cpuCount; i++) { - const worker = api.cluster.fork(); - workers.push(worker); - } - - const task = [2, 17, 3, 2, 5, 7, 15, 22, 1, 14, 15, 9, 0, 11]; - const results = []; - - workers.forEach((worker) => { - - worker.send({ task }); - - worker.on('exit', (code) => { - console.log('exit ' + worker.process.pid + ' ' + code); - }); - - worker.on('message', (message) => { - - console.log( - 'message from worker ' + worker.process.pid + ': ' + - JSON.stringify(message) - ); - results.push(message.result); - - if (results.length === cpuCount) { - process.exit(1); - } - - }); - - }); - -}; diff --git a/workers/multicore.js b/workers/multicore.js index c203bde..eb11325 100644 --- a/workers/multicore.js +++ b/workers/multicore.js @@ -1,11 +1,42 @@ 'use strict'; global.api = {}; -api.cluster = require('cluster'); +api.cp = require('child_process'); api.os = require('os'); -if (api.cluster.isMaster) { - require('./master.js')(); -} else { - require('./worker.js')(); +const cpuCount = api.os.cpus().length; +console.log('Number of CPUs in computer: ' + cpuCount); +console.log(); + +const task = [2, 17, 3, 2, 5, 7, 15, 22, 1, 14, 15, 9, 0, 11]; +const results = []; + +const header = 'PID\tMESSAGE'; +const TAB_LENGTH = 4; +console.log(header); +console.log('-'.repeat(header.length + TAB_LENGTH)); + +for (let i = 0; i < cpuCount; i++) { + const worker = api.cp.fork('./worker'); + + worker.on('message', (message) => { + console.log( + worker.pid + '\tFROM worker ' + + JSON.stringify(message) + ); + + results.push(message.result); + + if (results.length === cpuCount) { + console.log(); + console.log('Tasks done successfully by ' + cpuCount + ' workers.'); + process.exit(0); + } + }); + + worker.on('exit', (code) => { + console.log('exit ' + worker.pid + ' ' + code); + }); + + worker.send({ task }); } diff --git a/workers/worker.js b/workers/worker.js index a157232..85f08fb 100644 --- a/workers/worker.js +++ b/workers/worker.js @@ -1,22 +1,18 @@ 'use strict'; -module.exports = () => { +console.log(process.pid + '\tHELLO'); - console.log('Hello from worker ' + process.pid + ' ' + api.cluster.worker.id); +const caltulations = item => item * 2; - const caltulations = item => item * 2; +process.on('message', (message) => { - process.on('message', (message) => { - - console.log( - 'message to worker ' + process.pid + - ' from master: ' + JSON.stringify(message) - ); - - process.send({ - result: message.task.map(caltulations) - }); + console.log( + process.pid + '\t' + + 'FROM master: ' + JSON.stringify(message) + ); + process.send({ + result: message.task.map(caltulations) }); -}; +});