Пул воркеров
createWorkerPool() (vue-worker-kit/pool) — для множества мелких независимых задач (изменение размера сотен изображений и т. п.).
import { createWorkerPool } from 'vue-worker-kit/pool'
const pool = createWorkerPool<typeof import('./resize.worker')>(
() => new Worker(new URL('./resize.worker.ts', import.meta.url), { type: 'module' }),
)
// Заранее создать все воркеры до размера пула (опционально, избегает задержки холодного старта на первых задачах)
await pool.warmup()
// Обработка массива с передачей по элементу и глобальным сигналом отмены
const thumbnails = await pool.map(files, {
concurrency: 4,
transfer: (file) => [file.buffer], // zero-copy для каждого элемента
signal: abortController.signal, // отменить все выполняющиеся задачи
})
const one = await pool.run(files[0])Воркеры создаются лениво, до size, по мере поступления задач — не все сразу. size (опция) по умолчанию равен navigator.hardwareConcurrency — собственному числу логических ядер/потоков браузера на машине, где реально работает ваше приложение, а не числу, выбранному на этапе разработки. Передайте size явно, чтобы переопределить его (например, ограничить, или если navigator сообщает то, чему вы не доверяете — некоторые браузеры с усиленной приватностью ограничивают или округляют это значение). Откатывается к 4 там, где navigator не существует (SSR).
Методы
pool.run(input, options?)
(input: In, options?: { transfer?: Transferable[]; signal?: AbortSignal }) => Promise<Out>
Ставит задачу в очередь первому свободному воркеру.
pool.map(items, options?)
(items: In[], options?: MapOptions) => Promise<Out[]>
Обрабатывает массив с ограниченным параллелизмом, результаты в порядке входных данных.
concurrency?: number— максимум параллельных задач (по умолчанию:pool.size)transfer?: (item: T) => Transferable[]— функция передачи zero-copy для каждого элементаsignal?: AbortSignal— глобальный сигнал отмены для всех элементов
pool.stats
ComputedRef<{ busy: number; idle: number; queued: number }>
Реактивно, используется панелью devtools.
pool.terminate()
() => void
Завершает весь пул.
pool.warmup()
() => Promise<void>
Заранее создаёт все воркеры до size, не выполняя задачи.
useWorkerPool()
Тот же API, что и у createWorkerPool(), но с автоматическим завершением через onScopeDispose для использования прямо в setup() — используйте этот вариант, когда время жизни пула должно совпадать с временем жизни компонента.