diff --git a/package-lock.json b/package-lock.json index 0f71d49..b8c8450 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,8 @@ "eslint-plugin-typescript": "^0.14.0", "express": "^4.6.1", "express-ejs-layouts": "^1.1.0", + "express-fileupload": "^1.2.1", + "queue-microtask": "^1.2.3", "sqlite3": "^4.1.1", "ts-node": "^9.0.0", "typescript": "^4.1.2", @@ -27,7 +29,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^4.8.1", - "@typescript-eslint/parser": "^4.8.1", + "@typescript-eslint/parser": "^4.22.0", "eslint": "^7.14.0" } }, @@ -408,18 +410,104 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.8.1.tgz", - "integrity": "sha512-QND8XSVetATHK9y2Ltc/XBl5Ro7Y62YuZKnPEwnNPB8E379fDsvzJ1dMJ46fg/VOmk0hXhatc+GXs5MaXuL5Uw==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz", + "integrity": "sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.8.1", - "@typescript-eslint/types": "4.8.1", - "@typescript-eslint/typescript-estree": "4.8.1", + "@typescript-eslint/scope-manager": "4.22.0", + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/typescript-estree": "4.22.0", "debug": "^4.1.1" }, "engines": { "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", + "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", + "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", + "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", + "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/parser/node_modules/debug": { @@ -434,12 +522,36 @@ "node": ">=6.0" } }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/parser/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.8.1.tgz", @@ -1600,6 +1712,17 @@ "node": "*" } }, + "node_modules/express-fileupload": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.1.tgz", + "integrity": "sha512-fWPNAkBj+Azt9Itmcz/Reqdg3LeBfaXptDEev2JM8bCC0yDptglCnlizhf0YZauyU5X/g6v7v4Xxqhg8tmEfEA==", + "dependencies": { + "busboy": "^0.3.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2177,6 +2300,24 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -2705,6 +2846,25 @@ "node": ">=0.4.x" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3896,17 +4056,58 @@ } }, "@typescript-eslint/parser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.8.1.tgz", - "integrity": "sha512-QND8XSVetATHK9y2Ltc/XBl5Ro7Y62YuZKnPEwnNPB8E379fDsvzJ1dMJ46fg/VOmk0hXhatc+GXs5MaXuL5Uw==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz", + "integrity": "sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.8.1", - "@typescript-eslint/types": "4.8.1", - "@typescript-eslint/typescript-estree": "4.8.1", + "@typescript-eslint/scope-manager": "4.22.0", + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/typescript-estree": "4.22.0", "debug": "^4.1.1" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", + "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0" + } + }, + "@typescript-eslint/types": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", + "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", + "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", + "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.22.0", + "eslint-visitor-keys": "^2.0.0" + } + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -3916,11 +4117,26 @@ "ms": "2.1.2" } }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -4846,6 +5062,14 @@ "resolved": "https://registry.npmjs.org/express-ejs-layouts/-/express-ejs-layouts-1.1.0.tgz", "integrity": "sha1-nqoSJHpSpamnQfOM6HC5vEdxm/E=" }, + "express-fileupload": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.1.tgz", + "integrity": "sha512-fWPNAkBj+Azt9Itmcz/Reqdg3LeBfaXptDEev2JM8bCC0yDptglCnlizhf0YZauyU5X/g6v7v4Xxqhg8tmEfEA==", + "requires": { + "busboy": "^0.3.1" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5322,6 +5546,23 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -5741,6 +5982,11 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", diff --git a/package.json b/package.json index e9d786e..fd87afc 100755 --- a/package.json +++ b/package.json @@ -13,6 +13,8 @@ "eslint-plugin-typescript": "^0.14.0", "express": "^4.6.1", "express-ejs-layouts": "^1.1.0", + "express-fileupload": "^1.2.1", + "queue-microtask": "^1.2.3", "sqlite3": "^4.1.1", "ts-node": "^9.0.0", "typescript": "^4.1.2", @@ -29,7 +31,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^4.8.1", - "@typescript-eslint/parser": "^4.8.1", + "@typescript-eslint/parser": "^4.22.0", "eslint": "^7.14.0" } } diff --git a/src/modules/api/submodules/qminingapi.ts b/src/modules/api/submodules/qminingapi.ts index 52b44ce..ac2d52f 100644 --- a/src/modules/api/submodules/qminingapi.ts +++ b/src/modules/api/submodules/qminingapi.ts @@ -955,8 +955,6 @@ function setup(data: SubmoduleData): any { dbIndex: dbIndex, edits: req.body, }, - }).then((res) => { - console.log('AAAAAAAAAAA', res) }) } diff --git a/src/utils/classes.ts b/src/utils/classes.ts index 495e635..aa6455a 100755 --- a/src/utils/classes.ts +++ b/src/utils/classes.ts @@ -739,6 +739,9 @@ if (!isMainThread) { } else if (msg.type === 'newdb') { qdbs.push(msg.newdb) // console.log(`[THREAD #${workerIndex}]: newdb`) + } else { + logger.Log(`Invalid msg type!`, logger.GetColor('redbg')) + console.error(msg) } }) } else { diff --git a/src/utils/workerPool.ts b/src/utils/workerPool.ts index 5135bbe..956f28f 100644 --- a/src/utils/workerPool.ts +++ b/src/utils/workerPool.ts @@ -1,11 +1,9 @@ import { Worker } from 'worker_threads' import { v4 as uuidv4 } from 'uuid' +import { EventEmitter } from 'events' import os from 'os' import logger from './logger' -// import { QuestionDb } from '../types/basicTypes' - -// --------------------------------------------------------------------------- interface WorkerObj { worker: any @@ -13,17 +11,33 @@ interface WorkerObj { free: Boolean } -const jobCheckInterval = 500 +interface PendingJob { + workData: any + doneEvent: any + targetWorkerIndex?: number +} + const alertOnPendingCount = 10 const workerFile = './src/utils/classes.ts' let workers: Array -const pendingJobs = {} -const completedJobs = {} +const pendingJobs: { + [id: string]: PendingJob +} = {} + +const jobEvents = new EventEmitter() + +jobEvents.on('jobDone', () => { + processJob() +}) + +jobEvents.on('newJob', () => { + processJob() +}) // --------------------------------------------------------------------------- function handleWorkerError(worker: WorkerObj, err) { - // TODO + // TODO: restart worker if exited or things like that logger.Log('resourcePromise error', logger.GetColor('redbg')) console.error(err) } @@ -34,25 +48,18 @@ export function msgAllWorker(data: any): Promise { return new Promise((resolve) => { const promises = [] workers.forEach((worker) => { - worker.worker.postMessage(data) - console.log('MSGD') - promises.push( - new Promise((resolve) => { - worker.worker.once('message', (msg) => { - console.log(worker.index, 'ONCE MESSASGE RESOLVE') - resolve(msg) - }) - }) - ) + promises.push(doALongTask(data, worker.index)) }) Promise.all(promises).then((res) => { - console.log('MSG ALL DONE', res) resolve(res) }) }) } -export function doALongTask(obj: any): Promise { +export function doALongTask( + obj: any, + targetWorkerIndex?: number +): Promise { if (Object.keys(pendingJobs).length > alertOnPendingCount) { logger.Log( `More than ${alertOnPendingCount} callers waiting for free resource! (${ @@ -63,15 +70,19 @@ export function doALongTask(obj: any): Promise { } const jobId = uuidv4() - pendingJobs[jobId] = obj + // FIXME: delete doneEvent? + const doneEvent = new EventEmitter() + pendingJobs[jobId] = { + workData: obj, + targetWorkerIndex: targetWorkerIndex, + doneEvent: doneEvent, + } + jobEvents.emit('newJob') return new Promise((resolve) => { - const interval = setInterval(() => { - if (completedJobs[jobId] && completedJobs[jobId].done) { - resolve(completedJobs[jobId].result) - delete completedJobs[jobId] - clearInterval(interval) - } - }, jobCheckInterval) + doneEvent.once('done', (result) => { + jobEvents.emit('jobDone') + resolve(result) + }) }) } @@ -86,9 +97,7 @@ export function initWorkerPool(initData: any): void { return getAWorker(index, initData) }, destroy: function(client) { - // console.log('[DESTROY]') client.worker.terminate() - // console.log('[DESTROYED] #' + client.index) }, } @@ -107,51 +116,56 @@ export function initWorkerPool(initData: any): void { free: true, }) } - - // TODO: stop this interval sometime - setInterval(() => { - if (Object.keys(pendingJobs).length > 0) { - const freeWorker = workers.find((worker) => { - return worker.free - }) - if (!freeWorker) { - return - } - - if (freeWorker.free) { - freeWorker.free = false - } - // FIXME: FIFO OR ANYTHING ELSE (JOB PROCESSING ORDER) - const workKey = Object.keys(pendingJobs)[0] - const work = pendingJobs[workKey] - completedJobs[workKey] = { done: false } - delete pendingJobs[workKey] - - work.inProgress = true - processJob(work, freeWorker).then((res) => { - completedJobs[workKey].done = true - completedJobs[workKey].result = res - }) - } - }, jobCheckInterval) } // --------------------------------------------------------------------------- -function processJob(work, worker) { - return new Promise((resolve) => { - doSomething(worker, work) +function processJob() { + if (Object.keys(pendingJobs).length > 0) { + // FIXME: FIFO OR ANYTHING ELSE (JOB PROCESSING ORDER) + const keys = Object.keys(pendingJobs) + let jobKey, freeWorker + let i = 0 + while (!freeWorker && i < keys.length) { + jobKey = keys[i] + if (!isNaN(pendingJobs[jobKey].targetWorkerIndex)) { + if (workers[pendingJobs[jobKey].targetWorkerIndex].free) { + freeWorker = workers[pendingJobs[jobKey].targetWorkerIndex] + console.log( + `RESERVING WORKER ${pendingJobs[jobKey].targetWorkerIndex}` + ) + } + } else { + freeWorker = workers.find((worker) => { + return worker.free + }) + if (freeWorker) { + console.log(`RESERVING FIRST AVAILABLE WORKER ${freeWorker.index}`) + } + } + i++ + } + + if (!freeWorker) { + console.log('NO FREE WORKER') + return + } + + if (freeWorker.free) { + freeWorker.free = false + } + const job = pendingJobs[jobKey] + delete pendingJobs[jobKey] + + doSomething(freeWorker, job.workData) .then((res) => { - setTimeout(() => { - resolve(res) - // console.log('[RELEASE]: #' + client.index) - worker.free = true - }, 6000) + freeWorker.free = true + job.doneEvent.emit('done', res) }) .catch(function(err) { - handleWorkerError(worker, err) + handleWorkerError(freeWorker, err) }) - }) + } } function getAWorker(i, initData) { @@ -184,7 +198,6 @@ function getAWorker(i, initData) { function doSomething(currWorker, obj) { const { /* index, */ worker } = currWorker return new Promise((resolve) => { - // console.log('[ACCUIRE]: #' + index) worker.postMessage(obj) worker.once('message', (msg) => { resolve(msg)