0.1.0 • Published 7 years ago

throttle-queue v0.1.0

Weekly downloads
16
License
MIT
Repository
github
Last release
7 years ago

throttle-queue

A promise based priority queue with task deduplication, concurrency control, serial resolution and aging.

Installation

    npm install throttle-queue
            # OR
    yarn add throttle-queue

Features

  • Async jobs with promise support
  • Job Deduplication
  • Priority Assignment
  • Concurrency control
  • Aging of jobs to prevent starvation

All while keeping your code execution serial :)

Usage

const Queue = require("throttle-queue");
const taskQueue = new Queue({ concurrency: 2 });

taskQueue.setExecutor(async ({ pokemon }) => {
  const url = `https://pokeapi.co/api/v2/pokemon/${pokemon}`;
  const response = await fetch(url);
  return await response.json();
});

const result = await taskQueue.process({ pokemon: "mew" }, "mew")
console.log('I found', result)

API

Creating a queue

const queue = new Queue(options);

options

optiontypedefault valuedescription
concurrencynumber1Maximum number of jobs that can be run concurrently at the same time
agingbooleantrueWhether to age older jobs in order to prevent starvation
maxAgenumber (seconds)InfinityTime in seconds after which the job will expire and removed from the queue if not executed till then.

Setting a task executor (required)

const queue = new Queue(options);

queue.setExecutor(params => {
  console.log("received params", params);
  return "done";
});

The task executor picks up the highest priority task from the queue and executes it. It can be synchrounous or asynchronous. When sync, it is internally wrapped in a promise.

Adding a task to the queue

const queue = new Queue(options)
queue.setExecutor((params) => {
  console.log('received params', params)
  return 'done'
})

const result = await queue.process(params, id, options)

arguments

  • params - Object - An data object to pass to the task executor
  • id - The id of the task. This is used for deduplication.
  • options -
optiontypedefault valuedescription
prioritynumber'Queue.priority.LOW' (5)Priority of the job.
maxAgenumber (seconds)InfinityTime in seconds after which the job will expire. If not set, the global maxAge is used.
### Clearing the queue
```js
const queue = new Queue()
queue.clear()

Clears the queues of all waiting jobs. Jobs in execution are not disturbed.

Todo

  • Optimize perf for cases when there huge number of jobs in the ready queue.