Skip to content

Simple, no frills, threading in Node.js

License

Notifications You must be signed in to change notification settings

kevlened/threadwork

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

threadwork

Simple, no frills, threading in Node.js

Why

Other solutions were too complex. Many threading apps just need a way to create a thread pool and call the threaded function; that's what this does.

How

Most threading solutions stringify the function and arguments before passing them to a worker. Stringifying creates friction when using dependencies. threadwork skips stringifying the function by using a reference instead, reducing the effort to create a threaded function.

Example

// fibonacci.js
const { ThreadPool } = require('threadwork');

function fibonacci(n) {
	if (n < 2) return n;
	return fibonacci(n - 1) + fibonacci(n - 2);
}

module.exports = new ThreadPool({ task: fibonacci });
// index.js
const pool = require('./fibonacci');

(async () => {
	try {
		const results = await Promise.all([
			pool.run(10),
			pool.run(20),
			pool.run(30)
		]);
		console.log(results); // [55, 6765, 832040]
	} catch (e) {
		console.log(e);
	} finally {
		await pool.close();
	}
})();

API

  • new ThreadPool({ task, size }) - The primary class. It should be instantiated at the top-level and only once per file.

    • task - The worker runs this function
    • size - The number of workers in the pool (defaults to the number of cores)
  • await pool.run(arg1, arg2, ...) - Executes the task once with the arguments provided.

  • await pool.close() - Terminates all the workers, allowing the process to exit.

  • pool.isMainThread - Allows logic based on whether we're in a worker or not.

Compatibility

Node.js 12+ for stable worker_threads

ts-node-dev

There's best-effort support for ts-node-dev. You must provide the following:

  1. TS_NODE_DEV_CACHE as an environment variable
  2. The same directory should be provided to ts-node-dev via --cache-directory

CLI example:

TS_NODE_DEV_CACHE=.ts-node tsnd --cache-directory $TS_NODE_DEV_CACHE --respawn index.ts

License

MIT

See also