npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@aspiesoft/multi-task-queue

v1.3.1

Published

An advanced and easy to use queueing system

Downloads

11

Readme

Multi Task Queue

npm version GitHub top language GitHub license

npm downloads npm downloads jsDelivr hits (GitHub)

square

An advanced and easy to use queueing system

This task queue allows you to select/create a queue type, and seperate tasks into different queues. The queue simply runs your callback function to allow endless possibilities.

You can also add a task to multiple queue types, to make that task wait for all its queue types to be ready without blocking other queue types before its ready. You can also (optionally) add non-blocking tasks to the queue and they will wait for blocking tasks to finish, than run at the same time as other non blocking tasks.

This queue was made with custom database queueing in mind. You could queue a seperate type for each file, and a task can require multiple files to block in the queue. Single file reads and writes would be kept isolated, and if that file isn't blocked, it can still run asynchronously. A non-blocking task could be useful for read requests, so if multiple users try to read a file at the same time, it will happen asynchronously, and no reads are blocked until a blocking write request is made.

Tasks are blocking by default. This means the current task must finish, before the next task of that same type can start. When blocking is disabled, 2 tasks of the same type can run async at the same time. Once a blocking task shows up in the queue, the non blocking tasks behind it may wait.

Tasks are non priority by default. This means new tasks are added to the end of the queue. When a task is set as a priority, it will be added to the front of the queue. A priority task will Not stop a currently running task, it will still wait its turn, but cut in front of the other tasks that are still waiting in the queue.

What's New

  • Added "manual" option to use a "next" function to run the next task in the queue.
  • If the "manual" option is not explicitly set to false, this module will auto detect if your function requests an argument, and set the functions "manual" option to true if it does.

Installation

node.js

npm install multi-task-queue

cdn

<script src="https://cdn.jsdelivr.net/gh/AspieSoft/[email protected]/index.min.js"></script>

Usage


// require only if using node.js
const multiTaskQueue = require('multi-task-queue');

const taskQueue = multiTaskQueue(10 /* interval in milliseconds for the queue to run the next task */)


// you can make more than one queue instance (these queues are isolated)
const taskQueue2ndInstance = multiTaskQueue(100)



// add a task to the coffee queue
taskQueue('coffee', function(){
  // do anything you want here...
  console.log('coffee')
})

// add a task to the donut queue
taskQueue('donut', function() {
  // do anything you want here...
  console.log('donut')
})

// add a task that requires both the coffee and donut queue
taskQueue(['coffee', 'donut'], function() {
  // do anything you want here...
  console.log('coffee and donuts')
})

// add another task to the coffee queue
taskQueue('coffee', function() {
  // do anything you want here...
  console.log('java')
}, false /* non-blocking */)

// add an async task
taskQueue('coffee', async function() {
  // do anything you want here...
  await someAsyncFunction();
  console.log('someone spilled the coffee')
})


// add a non blocking task
taskQueue('coffee', function() {
  // do anything you want here...
  console.log('java anytime, I can wait')
}, false /* blocking = false */)

// add a priority task
taskQueue('coffee', function() {
  // do anything you want here...
  console.log('Need morning coffee ASAP!')
}, true /* blocking = true */, true /* priority = true */)


// by default
// blocking = true
// priority = false
// manual = false (new)


// new ways of setting blocking and priority (this module is backwards compatable with the old method)

// object
taskQueue('coffee', function() {
  console.log('Need morning coffee ASAP! I will Fill The Pot For Everyone!')
}, {blocking: false, priority: true})

// swap function placement
taskQueue('coffee', {blocking: false, priority: true}, function() {
  console.log('Need morning coffee ASAP! I will Fill The Pot For Everyone!')
})

// array
taskQueue('coffee', [true /* blocking = true */, false /* priority = false */], function() {
  console.log('more coffee')
})

// swap blocking and priority default values {blocking: false, priority: true}
taskQueue('coffee', null, function() {
  console.log('Need morning coffee ASAP! I will Fill The Pot For Everyone!')
})

// set blocking and priority to true
taskQueue('coffee', true, function() {
  console.log('Must Have Coffee!!!')
})

// set blocking and priority to false
taskQueue('coffee', false, function() {
  console.log('maybe some more coffee later')
})


// new option to manually finish queue
taskQueue('icecream', function(next) {
  console.log('ice cream')
  next()
}, {manual: true /* setting this to true means you need to run the "next" function when your done */})

taskQueue('icecream', function(next) {
  console.log('extra ice cream')
  // next() // not running "next" should prevent the next task
}, {manual: true})

taskQueue('icecream', function(next) {
  // this function should never be called
  console.log('no more ice cream :(')
  next()
}) /* note: if manual in undefined, this module will auto detect if your function accepts an argument */


// clear and reset the queue
taskQueue.clear()

// clear and reset the queue for a specific type
taskQueue.clear('coffee')

// clear and reset the queue for a lest of types
taskQueue.clear(['coffee', 'donut'])


// get the number of tasks queued for a specific type
taskQueue.len('coffee')

// get the total number of tasks queued for multiple types (added together)
taskQueue.len(['coffee', 'donut'])

// get the number of Running tasks for a specific type
taskQueue.len('coffee', true /* running = true */)

// get the total number of tasks for every type in this queue
taskQueue.len()

// get the total number of Running tasks for every type in this queue
taskQueue.len(true)