Created
January 6, 2018 12:21
-
-
Save DeMoorJasper/7a2a624c542546ef07c0fc5b8e8efef5 to your computer and use it in GitHub Desktop.
child_process ipc & shared memory experiment
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const { fork } = require('child_process'); | |
const cache = require('node-shared-cache'); | |
let childCache = new cache.Cache('children', 524288); | |
let child; | |
function startWorker(ready) { | |
child = fork(require.resolve('./worker'), { | |
cwd: process.cwd(), | |
silent: true | |
}); | |
child.send('init'); | |
child.once('message', (data) => { | |
ready(); | |
}); | |
child.stdout.pipe(process.stdout); | |
child.stderr.pipe(process.stderr); | |
} | |
function pingWorker(data, callback) { | |
childCache.request = data; | |
child.send(1); | |
child.once('message', (data) => { | |
callback(childCache.response); | |
}); | |
} | |
function sendMessage(data, callback) { | |
child.send(data); | |
child.once('message', (data) => { | |
callback(data); | |
}); | |
} | |
function kill() { | |
if (child) { | |
cache.release('children'); | |
child.kill('SIGTERM'); | |
} | |
child = null; | |
} | |
exports.startWorker = startWorker; | |
exports.pingWorker = pingWorker; | |
exports.sendMessage = sendMessage; | |
exports.kill = kill; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const testdata = require('../testdata.json'); | |
const cache = require('node-shared-cache'); | |
let processCache = new cache.Cache('children', 524288); | |
function initWorker() { | |
process.send('ready'); | |
} | |
function processMessage(type, data) { | |
switch (type) { | |
case 'ping': | |
data = processCache.request; | |
processCache.response = testdata; | |
process.send(1); | |
break; | |
case 'ipc': | |
process.send(testdata); | |
break; | |
} | |
} | |
process.on('message', (message) => { | |
if (message === 'init') { | |
initWorker(); | |
} else { | |
if (typeof message === 'number') { | |
processMessage('ping', message); | |
} else { | |
processMessage('ipc', message); | |
} | |
} | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const assert = require('assert'); | |
const testdata = require('../testdata.json'); | |
const master = require('../lib/master'); | |
function startWorker() { | |
return new Promise((resolve, reject) => { | |
master.startWorker(() => { | |
resolve(master); | |
}); | |
}); | |
} | |
function sendMessage(data) { | |
return new Promise((resolve, reject) => { | |
master.sendMessage(data, (response) => { | |
resolve(response); | |
}); | |
}); | |
} | |
function pingWorker(data) { | |
return new Promise((resolve, reject) => { | |
master.pingWorker(data, (response) => { | |
resolve(response); | |
}); | |
}); | |
} | |
describe('Workers', () => { | |
it('Startup time', async () => { | |
await startWorker(); | |
await master.kill(); | |
}); | |
it('Message time', async () => { | |
await startWorker(); | |
for (let i = 0; i < 1000; i++) { | |
await sendMessage(testdata); | |
} | |
await master.kill(); | |
}); | |
it('Ping worker + shared memory time', async () => { | |
await startWorker(); | |
for (let i = 0; i < 1000; i++) { | |
await pingWorker(testdata); | |
} | |
await master.kill(); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment