# thread-worker **Repository Path**: daoio/thread-worker ## Basic Information - **Project Name**: thread-worker - **Description**: Node.js环境线程扩展,基于worker_threads模块实现的灵活强大易用的线程扩展。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-07-28 - **Last Updated**: 2023-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # thread-worker Node.js环境的工作线程扩展,此扩展十分简单,就是封装了worker_threads模块,方便调用。 模块导出只有一个函数,定义如下: ```javascript /** * * @param {string} pathfile * @param {object} options * @returns {worker} */ function runWorkerThread(file, options = {}) ``` 参数可以直接参考Node.js官方文档对new Worker部分的描述。 只是options部分做了扩展,支持以下选项: | 选项 | 说明 | 是否必须 | |----|----|----| | restart | 重启模式,支持always,fail,fail-count;设置为true也认为是always | 否 | | restartDelay | 重启延时毫秒数 | 否 | | restartLimit | 针对fail-count模式,失败重启次数限制,若为fail-count模式,但是不设置此选项,则会一直失败重启。 | 否 | | events | 事件函数,传递key值为对应的事件名称,value为事件函数,此函数做了包装处理,第一个参数是创建的worker对象,后面的参数和事件函数传递参数一致。 | 否 | ## 安装 ```javascript npm i thread-worker ``` ## 基本使用 ```javascript 'use strict' const threads = require('thread-worker') //要通过线程运行的文件以及选项,其参数可以直接参照Node.js官方文档 //如果传递的是文件,要求文件必须是绝对路径,或以 . 开头的相对路径。 //扩展在检测到没有设置eval选项,会自动把a.js格式化为./a.js。 let worker = threads('a.js', { //如果你要给a.js传递参数,要使用此选项。 //请参考官方文档对选项的描述。 argv: [], restart: 'fail', restartDelay: 1000, events: { message: (w, msg) => { console.log('get message from', w.threadId, msg) await new Promise((rv) => { setTimeout(rv, 1000) }) w.postMessage({msg: 'ok, recived', time: (new Date).toLocaleString()}) }, // w就是worker,扩展做了包装处理, // 这样方便拿到worker对象。 exit: (w, code) => { console.log(w.threadId, code, 'exit') } } }) worker.on('online', () => { console.log(worker.threadId, 'running') }) worker.postMessage({ tid: worker.threadId, say: 'ok' }) ``` 在a.js文件中,存在以下代码: ```javascript 'use strict' const { parentPort } = require('node:worker_threads') parentPort.on('message', (msg) => { console.log('get message', msg) parentPort.postMessage({ pid: process.pid, rand: Math.random() }) }) ```