- private initWorkerTaskRunTime (workerKey: number): void {
- this.setWorkerTaskRunTime(workerKey, this.defaultWorkerWeight, 0)
- }
-
- private setWorkerTaskRunTime (
- workerKey: number,
- weight: number,
- runTime: number
- ): void {
- this.workersTaskRunTime.set(workerKey, {
- weight,
- runTime
- })
- }
-
- private getWorkerVirtualTaskRunTime (workerKey: number): number {
- return this.pool.workers[workerKey].tasksUsage.avgRunTime
- }
-
- private computeWorkerWeight (): number {
- let cpusCycleTimeWeight = 0
- for (const cpu of cpus()) {
- // CPU estimated cycle time
- const numberOfDigits = cpu.speed.toString().length - 1
- const cpuCycleTime = 1 / (cpu.speed / Math.pow(10, numberOfDigits))
- cpusCycleTimeWeight += cpuCycleTime * Math.pow(10, numberOfDigits)
- }
- return Math.round(cpusCycleTimeWeight / cpus().length)
+ private weightedRoundRobinNextWorkerNodeKey (): number | undefined {
+ do {
+ const workerWeight =
+ this.opts.weights?.[
+ this.nextWorkerNodeKey ?? this.previousWorkerNodeKey
+ ] ?? this.defaultWorkerWeight
+ if (this.workerNodeVirtualTaskRunTime < workerWeight) {
+ this.workerNodeVirtualTaskRunTime =
+ this.workerNodeVirtualTaskRunTime +
+ this.getWorkerNodeTaskRunTime(
+ this.nextWorkerNodeKey ?? this.previousWorkerNodeKey
+ )
+ } else {
+ this.nextWorkerNodeKey =
+ this.nextWorkerNodeKey === this.pool.workerNodes.length - 1
+ ? 0
+ : (this.nextWorkerNodeKey ?? this.previousWorkerNodeKey) + 1
+ this.workerNodeVirtualTaskRunTime = 0
+ }
+ } while (!this.isWorkerNodeReady(this.nextWorkerNodeKey as number))
+ return this.nextWorkerNodeKey