node-worker-threads-pool-ts
Version:
Simple worker threads pool using Node's worker_threads module. Compatible with ES6+ Promise, Typescript, Async/Await.
79 lines (77 loc) • 2.4 kB
JavaScript
;
/**
* @typedef {import("./pool-worker").TaskConfig} TaskConfig
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.DynamicPool = void 0;
const pool_1 = require("./pool");
const pool_worker_1 = require("./pool-worker");
const task_executor_1 = require("./task-executor");
const create_code_1 = require("./create-code");
const worker_threads_1 = require("worker_threads");
const script = `
const vm = require('vm');
const { parentPort } = require('worker_threads');
process.once("unhandledRejection", (err) => {
throw err;
});
parentPort.on('message', async ({ code, workerData, param }) => {
this.workerData = workerData;
const task = vm.runInThisContext(code);
const container = { task, workerData, require };
const result = await container.task(param);
parentPort.postMessage(result);
});
`;
/**
* Threads pool that can run different function
* each call.
*/
class DynamicPool extends pool_1.Pool {
/**
* @param size Number of workers.
* @param opt Some advanced settings.
*
*/
constructor(size, opt = {}) {
super(size);
const workerOpt = {
eval: true,
};
/* istanbul ignore next */
if (opt.shareEnv) {
workerOpt.env = worker_threads_1.SHARE_ENV;
}
/* istanbul ignore next */
if (typeof opt.resourceLimits === "object") {
workerOpt.resourceLimits = opt.resourceLimits;
}
this.fill(() => new pool_worker_1.PoolWorker(script, workerOpt, opt.isDone));
}
/**
* Choose a idle worker to execute the function
* with context provided.
*/
exec(options) {
const { task, param, workerData, timeout = 0 } = options;
if (typeof task !== "function") {
throw new TypeError('task "fn" must be a function!');
}
const code = create_code_1.createCode(task);
const workerParam = {
code,
param,
workerData,
};
return this.runTask(workerParam, { timeout });
}
/**
* Create a task executor of this pool.
* This is used to apply some advanced settings to a task.
*/
createExecutor(task) {
return new task_executor_1.DynamicTaskExecutor(this, task);
}
}
exports.DynamicPool = DynamicPool;
//# sourceMappingURL=dynamic-pool.js.map