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...
$.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???
//.progress(function(state){ queue.notify(state) })
.always(function(){ queue.notify(gid, 'done') })

View File

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

View File

@ -640,7 +640,7 @@ function makeDeferredsQ(first){
//
// NOTE: .enqueue(...) accepts a worker and any number of the arguments
// 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){
var cur = $.Deferred()
var args = Array.apply(null, arguments).slice(1)
@ -730,14 +730,14 @@ function makeDeferredsQ(first){
// Deferred worker pool...
//
// makeDefferedPool([size][, paused]) -> pool
// makeDeferredPool([size][, paused]) -> pool
//
//
// This will create and return a pooled queue of deferred workers.
//
// Public interface:
//
// .enqueue(obj, func, args) -> pool
// .enqueue(obj, func, args) -> deferred
// Add a worker to queue.
// If the pool is not filled and not paused, this will run the
// worker right away.
@ -793,7 +793,7 @@ function makeDeferredsQ(first){
//
//
// 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 < 0 ? 1
: size > 512 ? 512
@ -813,7 +813,7 @@ function makeDefferedPool(size, paused){
_paused: paused,
}
Pool._run = function(obj, func, args){
Pool._run = function(deferred, func, args){
var that = this
var pool = this.pool
var pool_size = this.size
@ -821,13 +821,13 @@ function makeDefferedPool(size, paused){
var run = this._run
// run an element from the queue...
var worker = func.apply(obj, args)
var worker = func.apply(null, args)
.always(function(){
// prepare to remove self from pool...
var i = pool.indexOf(worker)
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...
@ -875,6 +875,13 @@ function makeDefferedPool(size, paused){
Pool._fail_handlers.forEach(function(func){
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)
@ -904,13 +911,17 @@ function makeDefferedPool(size, paused){
// Add a worker to queue...
//
Pool.enqueue = function(obj, func, args){
Pool.enqueue = function(func){
var deferred = $.Deferred()
// 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...
this._fill()
return this
//return this
return deferred
}
// Drop the queued workers...

View File

@ -15,16 +15,16 @@ var WORKERS = {}
/********************************************************* Workers ***/
// 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...
if(WORKERS[name] == null){
var queue = makeDeferredsQ()
var queue = makeDeferredPool(pool_size, no_auto_start)
WORKERS[name] = queue
// start if needed...
if(!no_auto_start){
queue.start()
}
// return existing worker queue...
} else {
@ -38,15 +38,21 @@ function getWorkerQueue(name, no_auto_start){
// kill all worker queues...
function killAllWorkers(){
for(var k in WORKERS){
if(WORKERS[k].isWorking()){
if(WORKERS[k].isRunning()){
console.log('Worker: Stopped:', k)
}
WORKERS[k].kill()
WORKERS[k].dropQueue()
}
WORKERS = {}
}
/*********************************************************************/
/**********************************************************************
* vim:set ts=4 sw=4 : */