Skip to content

Instantly share code, notes, and snippets.

@prashanta
Last active May 15, 2020 20:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save prashanta/542c2ca7ae25b1d23ddd7ceec10bc305 to your computer and use it in GitHub Desktop.
Save prashanta/542c2ca7ae25b1d23ddd7ceec10bc305 to your computer and use it in GitHub Desktop.
Async.Queue usage
/**
* Prgram to test async.queue usage
* - gerenates tasks at the rate of "taskGenRate"
* - tasks are proocessed at the rate of "taskProcessRate"
* - process is paused when queue size reaches "maxQueueSize"
*/
const async = require('async');
let i = 0;
let paused = false;
const maxQueueSize = 20;
const taskGenRate = 100;
const taskProcessRate = 1000;
const q = async.queue( (task, cb) => {
serviceTask(task)
.then(cb);
}, 1);
q.drain(() => {
let ts = new Date();
ts = ts.toISOString();
console.log(`${ts} : ### Queue Drained`);
if (paused) {
console.log(`${ts} : ### Resume`);
paused = false;
}
});
// Generate tasks at regular interval
setInterval( () => {
if (!paused) {
i++;
const task = {index: i, a: Math.floor(Math.random()*10)};
let ts = new Date();
ts = ts.toISOString();
console.log(`${ts} : + ADDING task ${JSON.stringify(task)}`);
q.push(task);
console.log(`${ts} : queue length: ${q.length()}`);
if (q.length() >= maxQueueSize) {
console.log(`${ts} : ### Pause`);
paused = true;
}
}
}, taskGenRate);
const serviceTask = (task) => {
return new Promise( (resolve, reject) => {
setTimeout( () => {
let ts = new Date();
ts = ts.toISOString();
console.log(`${ts} : > RUNNING task ${JSON.stringify(task)}`);
resolve();
}, taskProcessRate);
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment