Concurrent Tasks
A simple task runner which will run all tasks till completion, while maintaining concurrency limits.
The following is a quick reference guide to help you get friendly with Concurrent Tasks. Visit the website for a detailed documentation.
Table of Contents
👶🏻 Introduction
Concurrent Tasks mimics a priority queue by using JavaScript's inbuilt array data type. Each task is a function which signals completion back to the TaskRunner
. Once tasks are added, the instance starts executing them until the concurrency criteria is met. Once even a single task is complete (it calls the done
callback), the next task in the queue is picked up.
What can I use it with?
The minimalism of Concurrent Tasks makes it an easy-to-use solution across any framework or flavour of JavaScript. It has ZERO dependencies and can be used virtually in any scenario.
- ✅ Vanilla JavaScript
- ✅ Frontend Frameworks (React, Vue, Angular, etc)
- ✅ Backend Frameworks (Express, Hapi, Koa, etc)
- ✅ NPM Module
- ✅ Node CLI Application
🎬 Getting Started
Via NPM
npm install concurrent-tasks
Or the script tag
<script src="https://unpkg.com/concurrent-tasks/umd/concurrent-tasks.min.js" type="text/javascript"></script>
Usage
import TaskRunner from 'concurrent-tasks';
const runner = new TaskRunner();
function generateTasks() {
const tasks = [];
let count = 1000;
while(count) {
tasks.push(done => {
setTimeout(() => {
done();
}, Math.random() * 1000)
});
count--;
}
return tasks;
}
runner.addMultiple(generateTasks());
Important: Each task passed to the task runner, necessarily has to call the done function. If not, your queue won't process properly.
🏁 The Done Callback
In JavaScript, it gets very difficult for tasks to talk to each other. A lot of times, we need to maintain a map of running tasks and call a function which will update the value and call the next task.
Concurrent Tasks is a JavaScript module, which runs multiple tasks in parallel until all the tasks are complete. It needs a way to figure out when a particular task has been completed.
Solution
Gulp solves this problem by either accepting a return of a Gulp task, or by calling a function done. Similarly, to solve the exact same problem, each task passed to the TaskRunner has access to a special function called done (ingenuity max).
Purpose
The purpose of this function is simple: Tell the instance when a particular task is complete! Internally, the done function does a fair amount of work. It:
- Makes a free slot available for the internal runner.
- Updates completion counts and calls the internal runner.
- Updates the time elapsed from start, until the function calling
done
's completion. - Calls the internal runner to pick up the next task in the priority queue.
Examples
For some examples on how you can use the callback, head over to the docs.
⚒ Configuration
Property | Type | Default | Description |
---|
concurrency | Number | 3 | Set the batch size of the task runner. |
autoStart | Boolean | true | Decides whether to start executing tasks automatically. |
name | String | Runner <instance-count> | A unique name to identify the TaskRunner instance. |
onAdd | Function | undefined | Fired every time add is called. |
onStart | Function | undefined | Fired every time the runner goes from idle to working state. |
onDone | Function | undefined | Fired each time a task calls done callback. |
onEnd | Function | undefined | Fired every time the runner goes from working to idle state. |
🕹 API
The following methods are provided by Concurrent Tasks to help you in manipulating your task list and get the most out of the module.
add
Adds a task to the task list.
add(task: Function, [first: Boolean])
addFirst
Adds a task to the beginning of the task list.
addFirst(task: Function, [first: Boolean])
addMultiple
Adds a collection of tasks to the task list.
addMultiple(tasks: Array.Function, [first: Boolean])
addMultipleFirst
Adds a collection of tasks to the beginning task list.
addMultipleFirst(tasks: Array.Function)
remove
Remove a task from the task list.
remove([first: Boolean])
removeFirst
Remove the first task from the task list.
removeFirst();
removeAt
Remove a task at a particular index from the task list.
removeAt(index: Number)
removeAll
Removes all tasks in the task list.
removeAll();
start
Programmatically start processing the first batch of tasks from the task list.
start();
setConcurrency
Set the concurrency limit on an already-running or a idle instance.
setConcurrency(concurrency: Number)
isBusy
Get the current state of the instance (idle or busy).
isBusy();
💪🏼 Powered by Concurrent Tasks
If you'd like to showcase any:
- Website
- Package
- Framework
- API
That's been powered by Concurrent Tasks, you can get in touch on Twitter or just use #poweredByConcurrentTasks and it'll be featured here!
👩🏻💻 Contributing
We ❤️ contributions! We are looking for people who echo our sentiments and share the same idea about Concurrent Tasks. Check out the contributing guidelines.
🧐 Issues
For any issues or queries you might have about the table, please feel free to create one in the issues section.
🗺 Roadmap
- ✅ Custom concurrency.
- ✅ Events for task addition, idle state change,
done
callback firing. - ✅ Programmatic and automatic start.
- ✅ Different kinds of addition and removal.
- ❌ Priority value for each task.
- ❌ Storing tasks as a map of priorities.
- ❌ Adding/removing tasks to/from an existing priority.
- ❌ Adding/removing multiple tasks to/from an existing priority.
- ❌ Adding tasks to a new priority.
- ❌ Adding multiple tasks to a new priority.
- ❌ Removal of a priority.
🔑 License
This project is under the MIT License. You can checkout the project's license for more info.
Copyright © 2018.