wingman
Version:
Parallelize functions across multiple processes
89 lines (68 loc) • 2.2 kB
text/coffeescript
async = require('async')
child_process = require('child_process')
path = require('path')
{EventEmitter} = require('events')
module.exports = class Task extends EventEmitter
constructor: ( , ) ->
'worker:message', (data) =>
return
'worker:completed', (subtaskComplete) =>
return
run: (callback) ->
=
started: 0
finished: 0
rate: 0
= 0
workerModulePath = path.join(__dirname, 'worker.coffee')
= (child_process.fork(workerModulePath, [ ]) for i in [0... .processes])
configureWorker = (worker, cb) =>
worker.on 'message', (m) =>
if (m.subtaskComplete)
worker.finished = m.subtaskComplete.finished
= true
for w in
if (!w.finished)
= false
break
else if (m.progress)
.started += m.progress.started
.finished += m.progress.finished
.rate += m.progress.rate
return
worker.on 'exit', (code, signal) ->
console.log(code, signal)
return
cb(null)
return
async.each , configureWorker, (err) =>
if (err)
callback(err)
else
'completed', (val) ->
callback(null, val) if callback
return
'error', (err) ->
callback(err) if callback
return
start: ->
#throw new Error('not implemented')
return
stop: ->
worker.kill() for worker in
return
processWorkerMessage: (data) ->
throw new Error('not implemented')
workerCompleted: (subtaskComplete) ->
throw new Error('not implemented')
sendToWorker: (data) ->
[ ].send(data)
++
= 0 if is .length