Is there any way by which one can apply priority to Node.js task's in a event loop.
I want to assign priority to task which are present in a event loop of nodejs.
Suppose in a event loop there are 5 jobs A,B,C,D,E which having same priority and then next job is received whose priority is higher than last five jobs. Then event loop starts executing that higher priority job.
-
A code example would help.tikider– tikider2014-09-30 08:46:18 +00:00Commented Sep 30, 2014 at 8:46
-
Added example please check it.Sanket– Sanket2014-09-30 11:14:57 +00:00Commented Sep 30, 2014 at 11:14
-
Why would you need to do this?neelsg– neelsg2014-09-30 11:33:21 +00:00Commented Sep 30, 2014 at 11:33
-
@neelsg: en.wikipedia.org/wiki/Dynamic_priority_scheduling is a well-known problem with lots of applicationsBergi– Bergi2014-09-30 12:13:55 +00:00Commented Sep 30, 2014 at 12:13
-
Actually in my application multiple functions' are executing parallelly i.e in a event loop. So if there are some important high priority functions are there so I want these functions to be executed first and then other.Sanket– Sanket2014-09-30 12:34:19 +00:00Commented Sep 30, 2014 at 12:34
|
Show 4 more comments
2 Answers
The event loop in node.js does not support priorities. See some documentation:
Short of rewriting it, I don't think there is much you can do about that.
Comments
You should use a priority queue, something like priorityqueuejs
In this way you can dequeue an item with the max priority and execute it.
Some code:
'use strict';
var PriorityQueue = require('priorityqueuejs');
var queue = new PriorityQueue(function(a, b) {
return a.value - b.value;
});
queue.enq({ value: 10, func: function() { console.log("PRIORITY: 10"); } });
queue.enq({ value: 500, func: function() { console.log("PRIORITY: 500"); } });
queue.enq({ value: 300, func: function() { console.log("PRIORITY: 300"); } });
queue.enq({ value: 100, func: function() { console.log("PRIORITY: 100"); } });
(function executeNext() {
if(queue.size()) {
var next = queue.deq();
next.func();
if(queue.size()) {
setTimeout(executeNext, 0);
}
}
})();
And the output is:
PRIORITY: 500
PRIORITY: 300
PRIORITY: 100
PRIORITY: 10
Here is the executeNext function extracts the next top-priority item and executes it.