https://github.com/shahidcodes/threadifier-node
Run long running task in worker thread with promises.
https://github.com/shahidcodes/threadifier-node
creating-threads multithreading nodejs promises thread-pool worker-thread
Last synced: 10 months ago
JSON representation
Run long running task in worker thread with promises.
- Host: GitHub
- URL: https://github.com/shahidcodes/threadifier-node
- Owner: shahidcodes
- Created: 2019-12-28T16:43:14.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2022-02-12T21:33:51.000Z (almost 4 years ago)
- Last Synced: 2025-02-25T04:05:42.040Z (11 months ago)
- Topics: creating-threads, multithreading, nodejs, promises, thread-pool, worker-thread
- Language: JavaScript
- Homepage:
- Size: 290 KB
- Stars: 7
- Watchers: 1
- Forks: 1
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Threadifier
### Motivation
Node has recently added worker_thread, giving us ability to run long running synchronous tasks in a separate thread. But API is not very seamless.
Threadifier allows you to run any function in different thread seamlessly through its easy to use promise based api. It uses `worker_threads` module to run the given function in a new thread and return the response asynchronously so your event loop keeps running. Also you can create a worker thread pool to reuse the same threads for various tasks.
## Get started
npm i @shahidcodes/threadifier
## Usage
### Run a function in different thread.
```javascript
const Threadifier = require('@shahidcodes/threadifier');
function runTask(arg) {
let i = 0;
for (let index = 0; index < 99999999; index++) {
i++;
}
return `worked- loop count ${i}, arg: ${JSON.stringify(arg)}`;
}
const args = { name: 'Shahid' };
Threadifier.run(runTask, args)
.then(console.log)
.catch(console.error);
```
### Create a pool of threads and queue the tasks (recommended)
```javascript
const { WorkerPool } = require('@shahidcodes/threadifier');
const pool = new WorkerPool(10);
function runTask(args) {
let i = 0;
for (let index = 0; index < 999999999; index++) {
i++;
}
return { i, args };
}
const args = { name: 'Shahid' };
for (let index = 0; index < 100; index++) {
pool
.queueTask(runTask, args)
.then(result => console.log(`from worker:`, result))
.catch(console.error);
}
```
## General Advice
You should not create many threads at once. If you're going to use this in a request handler/controller then better use a fixed size thread pool. And queue tasks otherwise you'll see CPU spikes when you spawn many many threads than the server can handle. One other reason you should use a thread pool is creating worker thread is expensive so if you're creating threads again n again then better use pool.
## Examples
Please check the [examples](./examples) directory.
## Contribution
You're free to submit PRs. There are no build/tests yet. But it is in roadmap.
## Contact
Feel free to contact me on [twitter.com/shahidcodes](https://twitter.com/shahidcodes)