Skip to content

Пул воркеров

createWorkerPool() (vue-worker-kit/pool) — для множества мелких независимых задач (изменение размера сотен изображений и т. п.).

ts
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() — используйте этот вариант, когда время жизни пула должно совпадать с временем жизни компонента.