-
-const clone = <T extends object>(object: T): T => {
- return JSON.parse(JSON.stringify(object)) as T
-}
-
-export const buildInternalWorkerChoiceStrategyOptions = (
- poolMaxSize: number,
- opts?: InternalWorkerChoiceStrategyOptions
-): InternalWorkerChoiceStrategyOptions => {
- opts = clone(opts ?? {})
- if (opts.weights == null) {
- opts.weights = getDefaultWeights(poolMaxSize)
- }
- return {
- ...getDefaultInternalWorkerChoiceStrategyOptions(
- poolMaxSize + Object.keys(opts?.weights ?? {}).length
- ),
- ...opts
- }
-}
-
-const getDefaultWeights = (
- poolMaxSize: number,
- defaultWorkerWeight: number = getDefaultWorkerWeight()
-): Record<number, number> => {
- const weights: Record<number, number> = {}
- for (let workerNodeKey = 0; workerNodeKey < poolMaxSize; workerNodeKey++) {
- weights[workerNodeKey] = defaultWorkerWeight
- }
- return weights
-}
-
-const getDefaultWorkerWeight = (): 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)
-}