reworked deferred pool and now it's used instead of makeDeferredsQ(..)...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2014-01-22 03:01:13 +04:00
parent 7e045c9c7f
commit a451547470
4 changed files with 43 additions and 25 deletions

View File

@ -368,7 +368,7 @@ if(window.CEF_dumpJSON != null){
// attach the workers to the queue... // attach the workers to the queue...
$.each(gids, function(_, gid){ $.each(gids, function(_, gid){
queue.enqueue(makeImagePreviews, gid, sizes, mode) queue.enqueue(null, makeImagePreviews, gid, sizes, mode)
// XXX do we need to report seporate previews??? // XXX do we need to report seporate previews???
//.progress(function(state){ queue.notify(state) }) //.progress(function(state){ queue.notify(state) })
.always(function(){ queue.notify(gid, 'done') }) .always(function(){ queue.notify(gid, 'done') })

View File

@ -843,7 +843,8 @@ function exportImagesTo(path, im_name, dir_name, size){
selection.sort(imageOrderCmp) selection.sort(imageOrderCmp)
var z = (('10e' + (selection.length + '').length) * 1 + '').slice(2) var z = (('10e' + (selection.length + '').length) * 1 + '').slice(2)
var pool = makeDefferedPool() // use an external pool...
var pool = makeDeferredPool()
.depleted(function(){ .depleted(function(){
showStatusQ('Export: done.') showStatusQ('Export: done.')
res.resolve() res.resolve()
@ -865,7 +866,7 @@ function exportImagesTo(path, im_name, dir_name, size){
var o = selection.indexOf(gid) + '' var o = selection.indexOf(gid) + ''
dest = dest.replace('%i', (z + o).slice(o.length)) dest = dest.replace('%i', (z + o).slice(o.length))
pool.enqueue(null, exportImageTo, [gid, path, dest, size]) pool.enqueue(exportImageTo, gid, path, dest, size)
} }
path = normalizePath(path +'/'+ dir_name) path = normalizePath(path +'/'+ dir_name)
@ -935,8 +936,6 @@ function readImagesOrientationQ(gids, no_update_loaded){
// attach workers to queue... // attach workers to queue...
$.each(gids, function(_, gid){ $.each(gids, function(_, gid){
last = queue.enqueue(readImageOrientation, gid, no_update_loaded) last = queue.enqueue(readImageOrientation, gid, no_update_loaded)
.done(function(){ queue.notify(gid, 'done') })
.fail(function(){ queue.notify(gid, 'fail') })
}) })
return queue return queue
@ -970,7 +969,7 @@ function readImagesDatesQ(images){
queue.enqueue(readImageDate, gid, images) queue.enqueue(readImageDate, gid, images)
.always(function(){ .always(function(){
imageUpdated(gid) imageUpdated(gid)
queue.notify(gid, 'done') //queue.notify(gid, 'done')
}) })
}) })
@ -1025,7 +1024,9 @@ function updateImagesGIDsQ(images, data){
$.each(images, function(_, key){ $.each(images, function(_, key){
queue.enqueue(updateImageGID, key, images, data) queue.enqueue(updateImageGID, key, images, data)
.always(function(){ queue.notify(key, 'done') }) .always(function(){
//queue.notify(key, 'done')
})
}) })
return queue return queue

View File

@ -640,7 +640,7 @@ function makeDeferredsQ(first){
// //
// NOTE: .enqueue(...) accepts a worker and any number of the arguments // NOTE: .enqueue(...) accepts a worker and any number of the arguments
// to be passed to the worker when it's its turn. // to be passed to the worker when it's its turn.
// NOTE: the worker must porduce a deffered/promice. // NOTE: the worker must porduce a deferred/promice.
queue.enqueue = function(worker){ queue.enqueue = function(worker){
var cur = $.Deferred() var cur = $.Deferred()
var args = Array.apply(null, arguments).slice(1) var args = Array.apply(null, arguments).slice(1)
@ -730,14 +730,14 @@ function makeDeferredsQ(first){
// Deferred worker pool... // Deferred worker pool...
// //
// makeDefferedPool([size][, paused]) -> pool // makeDeferredPool([size][, paused]) -> pool
// //
// //
// This will create and return a pooled queue of deferred workers. // This will create and return a pooled queue of deferred workers.
// //
// Public interface: // Public interface:
// //
// .enqueue(obj, func, args) -> pool // .enqueue(obj, func, args) -> deferred
// Add a worker to queue. // Add a worker to queue.
// If the pool is not filled and not paused, this will run the // If the pool is not filled and not paused, this will run the
// worker right away. // worker right away.
@ -793,7 +793,7 @@ function makeDeferredsQ(first){
// //
// //
// XXX should this be an object or a factory??? // XXX should this be an object or a factory???
function makeDefferedPool(size, paused){ function makeDeferredPool(size, paused){
size = size == null ? POOL_SIZE : size size = size == null ? POOL_SIZE : size
size = size < 0 ? 1 size = size < 0 ? 1
: size > 512 ? 512 : size > 512 ? 512
@ -813,7 +813,7 @@ function makeDefferedPool(size, paused){
_paused: paused, _paused: paused,
} }
Pool._run = function(obj, func, args){ Pool._run = function(deferred, func, args){
var that = this var that = this
var pool = this.pool var pool = this.pool
var pool_size = this.size var pool_size = this.size
@ -821,13 +821,13 @@ function makeDefferedPool(size, paused){
var run = this._run var run = this._run
// run an element from the queue... // run an element from the queue...
var worker = func.apply(obj, args) var worker = func.apply(null, args)
.always(function(){ .always(function(){
// prepare to remove self from pool... // prepare to remove self from pool...
var i = pool.indexOf(worker) var i = pool.indexOf(worker)
Pool._progress_handlers.forEach(function(func){ Pool._progress_handlers.forEach(function(func){
func(that, pool.length - pool.len(), pool.length + queue.length) func(worker, pool.length - pool.len(), pool.length + queue.length)
}) })
// remove self from queue... // remove self from queue...
@ -875,6 +875,13 @@ function makeDefferedPool(size, paused){
Pool._fail_handlers.forEach(function(func){ Pool._fail_handlers.forEach(function(func){
func(that, pool.length - pool.len(), pool.length + queue.length) func(that, pool.length - pool.len(), pool.length + queue.length)
}) })
deferred.reject.apply(deferred, arguments)
})
.progress(function(){
deferred.notify.apply(deferred, arguments)
})
.done(function(){
deferred.resolve.apply(deferred, arguments)
}) })
this.pool.push(worker) this.pool.push(worker)
@ -904,13 +911,17 @@ function makeDefferedPool(size, paused){
// Add a worker to queue... // Add a worker to queue...
// //
Pool.enqueue = function(obj, func, args){ Pool.enqueue = function(func){
var deferred = $.Deferred()
// add worker to queue... // add worker to queue...
this.queue.push([obj, func, args]) this.queue.push([deferred, func, args2array(arguments).slice(1)])
// start work if we have not already... // start work if we have not already...
this._fill() this._fill()
return this
//return this
return deferred
} }
// Drop the queued workers... // Drop the queued workers...

View File

@ -15,16 +15,16 @@ var WORKERS = {}
/********************************************************* Workers ***/ /********************************************************* Workers ***/
// get/create a named worker queue... // get/create a named worker queue...
function getWorkerQueue(name, no_auto_start){ //
// XXX rename this to task-related.... (???)
function getWorkerQueue(name, pool_size, no_auto_start){
// XXX 1 is the default for compatibility...
pool_size = pool_size == null ? 1 : pool_size
// create a new worker queue... // create a new worker queue...
if(WORKERS[name] == null){ if(WORKERS[name] == null){
var queue = makeDeferredsQ() var queue = makeDeferredPool(pool_size, no_auto_start)
WORKERS[name] = queue WORKERS[name] = queue
// start if needed...
if(!no_auto_start){
queue.start()
}
// return existing worker queue... // return existing worker queue...
} else { } else {
@ -38,15 +38,21 @@ function getWorkerQueue(name, no_auto_start){
// kill all worker queues... // kill all worker queues...
function killAllWorkers(){ function killAllWorkers(){
for(var k in WORKERS){ for(var k in WORKERS){
if(WORKERS[k].isWorking()){ if(WORKERS[k].isRunning()){
console.log('Worker: Stopped:', k) console.log('Worker: Stopped:', k)
} }
WORKERS[k].kill() WORKERS[k].dropQueue()
} }
WORKERS = {} WORKERS = {}
} }
/*********************************************************************/
/********************************************************************** /**********************************************************************
* vim:set ts=4 sw=4 : */ * vim:set ts=4 sw=4 : */