UNPKG

fast-worker

Version:

Module for executing heavy tasks in parallel, by providing a `Promise` based interface, minimum overhead, and bound workers.

135 lines (101 loc) 3.52 kB
[npm]: https://img.shields.io/npm/v/fast-worker [npm-url]: https://www.npmjs.com/package/fast-worker [size]: https://packagephobia.now.sh/badge?p=fast-worker [size-url]: https://packagephobia.now.sh/result?p=fast-worker # fast-worker [![npm][npm]][npm-url] [![size][size]][size-url] - Module for executing heavy tasks in parallel, by providing a `Promise` based interface, minimum overhead, and bound workers. `fast-worker` uses a unified, efficient and scalable thread-pool internally, makes full use of system resources, and reduces unnecessary memory consumption and complex configuration. Multiple `fast-worker` instances use the same thread-pool in the same process. You can use this worker by making similar simple calls to the target module. ## Features - 🤭 Supports for functions to be passed to workers as arguments. (which will be converted to asynchronous functions) - 🤟 Supports es-modules. - ⚡️ Unified and flexible thread-pool manager. - ✨ `Typescript` supports. - 💚 Automatically releases unreferenced `fast-worker` instances. (Node.js >= 14.6.0) ## Install ### npm ``` $ npm install fast-worker --save-dev ``` ### Yarn ``` $ yarn add fast-worker --dev ``` ### pnpm ``` $ pnpm add fast-worker --save-dev ``` ## Usage This example covers the minimal usage: #### File `worker.ts` ```ts export function hello(param) { return `Hello, ${param}` } export async function workerCall(fn, ...args) { return `result: ${await fn(...args)}` } // private export function _privateMethod() { return `I am a private method` } ``` #### File `main.ts` ```ts import { createFastWorker } from 'fast-worker' import { fileURLToPath } from 'url' import { dirname, join } from 'path' const _dirname = dirname(fileURLToPath(import.meta.url)) const _targetModulePath = join(_dirname, './worker') async function main() { // create fast-worker instance const worker = createFastWorker<typeof import('./worker')>(_targetModulePath, { /* FastWorkerOptions */ }) // invoke `hello` method. console.log(await worker.hello('Jock')) // Hello, Jock // invoke `workerCall` method. console.log(await worker.workerCall((a, b) => a * b, 30, 50)) // result: 1500 // Methods that begin with '_' are marked as private and not directly accessible. // console.log(await worker._privateMethod()) // Error! // dispose `fast-worker`. worker.dispose() } main() ``` ## Options ```ts interface FastWorkerOptions<Module extends Record<keyof any, any>> { /** * Maximum number of times to re execute when execution fails. * @default 0 */ maxRetries?: number /** * By default, the 'fast worker' task can be handed over to the main thread or the worker thread for execution. * Enable this option will force the task to be handed over to the worker thread for execution. * * Please set this to True if you are using es-module. */ onlyExecInWorker?: boolean /** * Sets the timeout period to throw an exception if the task is not completed within the specified time. * @default 5000 */ timeout?: number | null /** * Set the retry interval. * @default 0 */ retryInterval?: number /** * init (NEW) */ onInit?: (this: Omit<FastWorker<Module>, 'dispose' | 'disposed'>) => void } ``` ## Give a ⭐️ if this project helped you! ## License [MIT](./LICENSE) License © 2022 xxXyh1908