UNPKG

threads-manager

Version:

The threads-manager module is designed to simplify the management of worker threads in a Node.js environment. It provides a structured way to create, execute, and handle worker threads that perform asynchronous tasks.

103 lines (95 loc) 3 kB
const { Worker } = require("worker_threads"); const createWorkerThread = () => { const worker = initWorkerThread(); let onSuccessCallback = null; return { run: (func, data) => executeThread(worker, func, data, onSuccessCallback), onError: (func) => handleError(worker, func), onExit: (func) => handleExit(worker, func), terminate: (func) => handleTerminate(worker, func), onSuccess: (func) => { onSuccessCallback = func; } } } const initWorkerThread = () => { try { const workerCode = ` try { const { parentPort } = require("worker_threads"); parentPort.on('message', ({ funcString, data }) => { const job = eval('(' + funcString + ')'); const result = job(data); parentPort.postMessage({success: true, data: result, error: false}); }); } catch (e) { parentPort.postMessage({success: false, data: null, error: e}); } `; const worker = new Worker(workerCode, { eval: true }); return worker; } catch (err) { throw new Error(err); } } const executeThread = (worker, func = () => { }, data = '', onSuccessCallback) => { try { const job = func.toString(); worker.postMessage({ funcString: job, data: data }); worker.on('message', (result) => { console.log(`Thread completed execution: ${func.name}`); if (result.success) { if (onSuccessCallback) { onSuccessCallback(result); } } else { console.error('Worker execution failed:', result.error); } }); } catch (err) { throw new Error(err); } } const handleError = (worker, func = () => { }) => { try { worker.on('error', (error) => { console.error('Thread failed to execute:', error); func && func(); return error; }); } catch (err) { throw new Error(err); } } const handleExit = (worker, func = () => { }) => { try { worker.on('exit', (code) => { if (code !== 0) { console.error(`Worker stopped with exit code ${code}`); } else { console.log('Worker stopped normally'); } func && func(); return code; }); } catch (err) { throw new Error(err); } } const handleTerminate = (worker, func = () => { }) => { try { worker.terminate() .then((status) => { console.log('Worker terminated:', status); }) .catch((err) => { console.error('Error terminating worker:', err); }); func && func(); } catch (err) { console.log(err); } } module.exports = { createWorkerThread }