{"id":15789931,"url":"https://github.com/gettocat/mtpool","last_synced_at":"2025-03-31T18:27:25.717Z","repository":{"id":94927225,"uuid":"567183728","full_name":"gettocat/mtpool","owner":"gettocat","description":"Multi threading on node","archived":false,"fork":false,"pushed_at":"2022-11-17T11:22:21.000Z","size":80,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-05T22:04:13.478Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gettocat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-17T08:51:08.000Z","updated_at":"2022-11-17T10:16:21.000Z","dependencies_parsed_at":"2023-04-12T08:16:17.097Z","dependency_job_id":null,"html_url":"https://github.com/gettocat/mtpool","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gettocat%2Fmtpool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gettocat%2Fmtpool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gettocat%2Fmtpool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gettocat%2Fmtpool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gettocat","download_url":"https://codeload.github.com/gettocat/mtpool/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246516939,"owners_count":20790324,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-04T22:04:14.345Z","updated_at":"2025-03-31T18:27:25.696Z","avatar_url":"https://github.com/gettocat.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MultiThreading Pool\n\n##  Example\n\nCreate new pool\n```js\nconst { Pool, WorkerEvent } = require(\"mtpool\");\nconst pool = new Pool('simplePool', 2, './worker.js');\n\npool.on('debug', (arr) =\u003e {\n    console.log.apply(this, arr);\n});\n\npool.on('workerProcessed', ({ workerId, data }) =\u003e {\n    console.log('worker processed', workerId, data);\n})\n\npool.on('ready', () =\u003e {\n    //start work\n    //all workers inited\n\n    for (let i = 0; i \u003c= 100; i++) {\n        pool.addToQueue({ id: i, param1: i, param2: i });\n    }\n});\n\npool.on('empty', () =\u003e {\n    console.log('queue is empty now');\n    pool.terminateWorkers();\n})\n```\n\nAnd worker.js file, containing next:\n\n```js\nconst { WorkerApp } = require('mtpool');\n\nclass Worker1 extends WorkerApp {\n    constructor(cb) {\n        super(cb);\n    }\n    init() {\n        return new Promise((resolve, reject) =\u003e {\n            resolve();\n        })\n    }\n    processTask(taskdata) {\n        return Promise.resolve(taskdata.param1 + taskdata.param2);\n    }\n}\n\nnew Worker1().start();\n```\n\n## Send request from worker to pool\n\nSometimes we need some info from pool, we can send request from worker with this code:\n\n```js\n//WorkerApp context\nprocessTask(taskdata) {\n    //process task task.data\n    //console.log('worker id', this.id, 'process task', taskdata)\n    return this.request('getInfoFromPool', { index: this.id, someanotherDataToPool: true })\n        .then((result) =\u003e {\n            this.debug('response from pool for workerId ' + this.id + ' random data' + result);\n            return Promise.resolve(result)//result = event.data.params.index * 3\n        })\n        .then((res) =\u003e {\n            return res + taskdata.param1 + taskdata.param2;\n        })\n}\n```\n\nand handle this request in pool by this event:\n```js\n//Pool context\npool.on('workerRequest', ({ event, workerId, callback }) =\u003e {\n    if (event.data.method == 'getInfoFromPool') {\n        if (event.data.params.someanotherDataToPool)\n            console.log('ask from worker ' + workerId + ' random data', (event.data.params.index + 1) * 3);\n        callback(event.data.params.index * 3);\n    }\n});\n```\n\n## Docs\n\n### Pool Methods\n\n```ts\nnew Pool(\u003cpoolName\u003e, \u003cworkerCount\u003e, \u003cPathToWorkerFile\u003e) // creating new pool \n```\n\n```ts\npool.incrementWorkerCount(count) //add count workers to pool\n```\n\n```ts\npool.decrementWorkerCount(count) //remove count workers from pool.\n```\n**Caution: you can loose worker progress and worker queue, better use this method `decrementWorkerCount` after pool event `empty`**\n\n```ts\npool.terminateWorkers(force = false): Promise\u003cany[]\u003e //terminate workers\n```\nif `force` param is set to `true` - remove active workers with queue \u003e 0. Else - throw Error if one of the worker have pending work.\n\n```ts\npool.sendToWorker(index: number, data: WorkerEvent) //send event to worker from pool \n```\n\n```ts\npool.addToQueue(task: Task | any) // add work to pool. \n```\nTask can be any data, than will be sent to worker `processTask` method\n\n```js\npool.getStats() // get pool workers stats\n```\n\nType of stats records: \n\n```ts\nclass PoolStats {\n  lastProcessed: number;\n  avgTimePerSecond: number;\n  queue: number;\n}\n```\n\n### Pool Events\n\n* `ready` | `empty params` - fires when all workers inited with promise from `init` method in workerApp\n* `empty` | `empty params` - fires when queue of workers and pool queue is 0. No have work\n* `queue` | `count` - fires when pool queue updating\n* `workerQueue` | ` { workerId, count } ` fires when worker queue updating\n* `workerEvent` | `{ event, workerId }` - fires when some event sending from worker\n* `workerRequest` | `{ event, workerId, callback }` - fires when worker send request from workerApp (with `WorkerApp.request` method). After pool handle this request, handler must call  `callback(response)`.\n* `workerProcessed` | `{ data, workerId }` - fires when task processed by worker. \n* `inited` | `workerIndex` - fires when worker inited\n* `debug` | `[poolName, Date, ...debugInfo]` - get debug information from pool and workers \n\n### WorkerApp methods\n\n```js \nworker.start() // start worker\n```\n\n```js\nclass WorkerExample extends WorkerApp {\n    init() {\n        return new Promise((resolve, reject) =\u003e {\n            //init worker Data, for example init db connection\n            resolve();//after releasing promise - will be send to pool event inited\n        })\n    }\n    processTask(taskdata) {\n        //must be reimplemented in child class. Must return promise.\n        return Promise.resolve();\n    }\n}\n```\nMust be reimplemented in child class. And must return Promise. WorkerApp invoke this method when new task received from pool, and when promise is done - send `workerEvent(name='processed')` event to pool.\n\n```js\nworker.request('method', data); // send method and data to pool. Return Promise\u003cresponse\u003e.\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgettocat%2Fmtpool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgettocat%2Fmtpool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgettocat%2Fmtpool/lists"}