Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including drotto with all npm packages installed. Try it out:

var drotto = require("drotto")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

drotto v0.3.5

NodeJS Process Pool

drotto

Drotto ("Dr Otto") is a lean, NodeJS process pool, allowing for both single and multi function parallel processing.

Why drotto?

NodeJS is single threaded. While I/O tasks can be parallelized over the OS with it’s asynchronous architecture, CPU bound workloads block the event loop, leading to potentially disastrous performance. To avoid this, NodeJS offers libraries to parallelize CPU bound workloads over CPU cores via new processes. Drotto is a lightweight abstraction for managing creation, delegation, and deletion of parallelized NodeJS worker processes.

More Info

Installation

$ npm i --save drotto

Examples

SEE tutorials for more code samples

To parallelize a single function:

(async () => {
 // obtain an Executor instance
 const executor = Executor.fixedPool(os.cpus().length - 1);

  // invoke cpu bound function with param
 const p = executor.invoke(max => {
   for (let i = 0; i < max; i++) { }
   return max;
 }, [500000000]);

 // handle promise
 p.then(result => {
   console.log(`Finished ${result} iterations...`);
   executor.shutdown(); // stop processes
 }).catch(e => {
   console.log('Exception', e);
   executor.shutdown(); // stop processes
 });

 console.log('asynchronous execution...');
})();

To parallelize multiple functions:

(async () => {
 // obtain an Executor instance
 const executor = Executor.fixedPool(os.cpus().length - 1);
 
  // cpu bound function
 const fn = (max) => {
   for (let i = 0; i < max; i++) { }
   return max;
 };

 try {
   console.log('Running four functions...');
  
   const promises = executor.invokeAll([fn, fn, fn, fn], [[40000000], [20000000], [60000000], [30000000]]);
   const results = await Promise.all(promises);

   console.log('Finished all iterations...', results);
 } catch (e) {
   console.log('Exception Message', e.message);
   console.log('Exception Stack Trace', e.stack);
 }

 executor.shutdown();
})();

Limitations

Currently the CPU bound functions are not able to run functions or functions attached to objects that are injected as parameters, nor are they able to require additional modules from inside of the functions.

Metadata

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free