Обмен данными с worker_threads
Вопрос
Воркерам нужен доступ к большому числовому массиву (200 МБ) только на чтение, а главный поток периодически отправляет задачи. Как избежать копирования 200 МБ на каждую задачу?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Передавать массив через
postMessage: он передаётся по ссылке без копии - Сохранить массив в глобальной переменной главного потока, и воркеры её увидят
SharedArrayBuffer, переданный один раз: память общая, запись черезAtomicsправильный ответ- Сериализовать в JSON и передавать строкой, это быстрее structured clone
Разбор
postMessage копирует данные алгоритмом structured clone, а ArrayBuffer можно только передать (transfer), после чего у отправителя он станет пустым. SharedArrayBuffer один на всех: передаётся один раз, копий нет, а для согласованной записи используются Atomics (атомарные операции, wait/notify).
У воркеров свой изолированный JS-контекст, глобальные переменные главного потока им не видны. JSON медленнее и тяжелее structured clone и снова копирует.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Утечка памяти в проде: план действий
Следующий вопрос
worker_threads или cluster для CPU-задачи
Термины по теме
Ещё по теме «Кластер, воркеры, масштабирование»
- Консистентное хеширование с виртуальными узлами
- Балансировка least connections
- Плавный взвешенный round-robin как в nginx
- Код-ревью: сервис перед масштабированием в 4 инстанса
- Модуль cluster
- cluster внутри Kubernetes
- Память у воркеров cluster
- cluster или worker_threads