diff --git a/packages/vitest/src/node/pool.ts b/packages/vitest/src/node/pool.ts index caa563af7e8d..372e9ea6d321 100644 --- a/packages/vitest/src/node/pool.ts +++ b/packages/vitest/src/node/pool.ts @@ -175,11 +175,11 @@ export function createPool(ctx: Vitest): ProcessPool { const groupedSpecifications: Record = {} const groups = new Set() - const factories: Record ProcessPool> = { - vmThreads: () => createVmThreadsPool(ctx, options), - vmForks: () => createVmForksPool(ctx, options), - threads: () => createThreadsPool(ctx, options), - forks: () => createForksPool(ctx, options), + const factories: Record ProcessPool> = { + vmThreads: specs => createVmThreadsPool(ctx, options, specs), + vmForks: specs => createVmForksPool(ctx, options, specs), + threads: specs => createThreadsPool(ctx, options, specs), + forks: specs => createForksPool(ctx, options, specs), typescript: () => createTypecheckPool(ctx), } @@ -241,7 +241,7 @@ export function createPool(ctx: Vitest): ProcessPool { if (pool in factories) { const factory = factories[pool] - pools[pool] ??= factory() + pools[pool] ??= factory(specs) return pools[pool]![method](specs, invalidate) } diff --git a/packages/vitest/src/node/pools/forks.ts b/packages/vitest/src/node/pools/forks.ts index cd436be7c724..e5c8d444fbb5 100644 --- a/packages/vitest/src/node/pools/forks.ts +++ b/packages/vitest/src/node/pools/forks.ts @@ -5,6 +5,7 @@ import type { ContextRPC, ContextTestEnvironment } from '../../types/worker' import type { Vitest } from '../core' import type { PoolProcessOptions, ProcessPool, RunWithFiles } from '../pool' import type { TestProject } from '../project' +import type { TestSpecification } from '../spec' import type { SerializedConfig } from '../types/config' import EventEmitter from 'node:events' import * as nodeos from 'node:os' @@ -65,6 +66,7 @@ function createChildProcessChannel(project: TestProject, collect = false) { export function createForksPool( vitest: Vitest, { execArgv, env }: PoolProcessOptions, + specifications: TestSpecification[], ): ProcessPool { const numCpus = typeof nodeos.availableParallelism === 'function' @@ -75,12 +77,16 @@ export function createForksPool( ? Math.max(Math.floor(numCpus / 2), 1) : Math.max(numCpus - 1, 1) + const recommendedCount = vitest.config.watch + ? threadsCount + : Math.min(threadsCount, specifications.length) + const poolOptions = vitest.config.poolOptions?.forks ?? {} const maxThreads - = poolOptions.maxForks ?? vitest.config.maxWorkers ?? threadsCount + = poolOptions.maxForks ?? vitest.config.maxWorkers ?? recommendedCount const minThreads - = poolOptions.minForks ?? vitest.config.minWorkers ?? Math.min(threadsCount, maxThreads) + = poolOptions.minForks ?? vitest.config.minWorkers ?? Math.min(recommendedCount, maxThreads) const worker = resolve(vitest.distPath, 'workers/forks.js') diff --git a/packages/vitest/src/node/pools/threads.ts b/packages/vitest/src/node/pools/threads.ts index 61580d9e9040..f2766dda5883 100644 --- a/packages/vitest/src/node/pools/threads.ts +++ b/packages/vitest/src/node/pools/threads.ts @@ -5,6 +5,7 @@ import type { ContextTestEnvironment } from '../../types/worker' import type { Vitest } from '../core' import type { PoolProcessOptions, ProcessPool, RunWithFiles } from '../pool' import type { TestProject } from '../project' +import type { TestSpecification } from '../spec' import type { SerializedConfig } from '../types/config' import type { WorkerContext } from '../types/worker' import * as nodeos from 'node:os' @@ -46,6 +47,7 @@ function createWorkerChannel(project: TestProject, collect: boolean) { export function createThreadsPool( vitest: Vitest, { execArgv, env }: PoolProcessOptions, + specifications: TestSpecification[], ): ProcessPool { const numCpus = typeof nodeos.availableParallelism === 'function' @@ -56,12 +58,16 @@ export function createThreadsPool( ? Math.max(Math.floor(numCpus / 2), 1) : Math.max(numCpus - 1, 1) + const recommendedCount = vitest.config.watch + ? threadsCount + : Math.min(threadsCount, specifications.length) + const poolOptions = vitest.config.poolOptions?.threads ?? {} const maxThreads - = poolOptions.maxThreads ?? vitest.config.maxWorkers ?? threadsCount + = poolOptions.maxThreads ?? vitest.config.maxWorkers ?? recommendedCount const minThreads - = poolOptions.minThreads ?? vitest.config.minWorkers ?? Math.min(threadsCount, maxThreads) + = poolOptions.minThreads ?? vitest.config.minWorkers ?? Math.min(recommendedCount, maxThreads) const worker = resolve(vitest.distPath, 'workers/threads.js') diff --git a/packages/vitest/src/node/pools/vmForks.ts b/packages/vitest/src/node/pools/vmForks.ts index 8ad8344ba785..338a52fd9e96 100644 --- a/packages/vitest/src/node/pools/vmForks.ts +++ b/packages/vitest/src/node/pools/vmForks.ts @@ -5,6 +5,7 @@ import type { ContextRPC, ContextTestEnvironment } from '../../types/worker' import type { Vitest } from '../core' import type { PoolProcessOptions, ProcessPool, RunWithFiles } from '../pool' import type { TestProject } from '../project' +import type { TestSpecification } from '../spec' import type { ResolvedConfig, SerializedConfig } from '../types/config' import EventEmitter from 'node:events' import * as nodeos from 'node:os' @@ -72,6 +73,7 @@ function createChildProcessChannel(project: TestProject, collect: boolean) { export function createVmForksPool( vitest: Vitest, { execArgv, env }: PoolProcessOptions, + specifications: TestSpecification[], ): ProcessPool { const numCpus = typeof nodeos.availableParallelism === 'function' @@ -82,12 +84,16 @@ export function createVmForksPool( ? Math.max(Math.floor(numCpus / 2), 1) : Math.max(numCpus - 1, 1) + const recommendedCount = vitest.config.watch + ? threadsCount + : Math.min(threadsCount, specifications.length) + const poolOptions = vitest.config.poolOptions?.vmForks ?? {} const maxThreads - = poolOptions.maxForks ?? vitest.config.maxWorkers ?? threadsCount + = poolOptions.maxForks ?? vitest.config.maxWorkers ?? recommendedCount const minThreads - = poolOptions.maxForks ?? vitest.config.minWorkers ?? Math.min(threadsCount, maxThreads) + = poolOptions.maxForks ?? vitest.config.minWorkers ?? Math.min(recommendedCount, maxThreads) const worker = resolve(vitest.distPath, 'workers/vmForks.js') diff --git a/packages/vitest/src/node/pools/vmThreads.ts b/packages/vitest/src/node/pools/vmThreads.ts index 36981c066696..0aafc2cac47d 100644 --- a/packages/vitest/src/node/pools/vmThreads.ts +++ b/packages/vitest/src/node/pools/vmThreads.ts @@ -5,6 +5,7 @@ import type { ContextTestEnvironment } from '../../types/worker' import type { Vitest } from '../core' import type { PoolProcessOptions, ProcessPool, RunWithFiles } from '../pool' import type { TestProject } from '../project' +import type { TestSpecification } from '../spec' import type { ResolvedConfig, SerializedConfig } from '../types/config' import type { WorkerContext } from '../types/worker' import * as nodeos from 'node:os' @@ -49,6 +50,7 @@ function createWorkerChannel(project: TestProject, collect: boolean) { export function createVmThreadsPool( vitest: Vitest, { execArgv, env }: PoolProcessOptions, + specifications: TestSpecification[], ): ProcessPool { const numCpus = typeof nodeos.availableParallelism === 'function' @@ -59,12 +61,16 @@ export function createVmThreadsPool( ? Math.max(Math.floor(numCpus / 2), 1) : Math.max(numCpus - 1, 1) + const recommendedCount = vitest.config.watch + ? threadsCount + : Math.min(threadsCount, specifications.length) + const poolOptions = vitest.config.poolOptions?.vmThreads ?? {} const maxThreads - = poolOptions.maxThreads ?? vitest.config.maxWorkers ?? threadsCount + = poolOptions.maxThreads ?? vitest.config.maxWorkers ?? recommendedCount const minThreads - = poolOptions.minThreads ?? vitest.config.minWorkers ?? Math.min(threadsCount, maxThreads) + = poolOptions.minThreads ?? vitest.config.minWorkers ?? Math.min(recommendedCount, maxThreads) const worker = resolve(vitest.distPath, 'workers/vmThreads.js')