Выбор ответа Senior Кластер, воркеры, масштабирование обновлено

Передача данных в worker_threads

Вопрос

Как передать в воркер ArrayBuffer на 200 МБ без копирования?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: worker.postMessage(buf, [buf]): передача владения буфером. По умолчанию postMessage копирует данные алгоритмом structured clone.

Варианты ответа

  1. worker.postMessage(buf): сообщения всегда передаются по ссылке
  2. Через глобальную переменную, у воркеров общая куча с главным
  3. Через process.env, туда помещается двоичная строка
  4. worker.postMessage(buf, [buf]): передача владения буферомправильный ответ

Разбор

По умолчанию postMessage копирует данные алгоритмом structured clone. Если указать буфер в transfer list, владение памятью переходит воркеру без копирования, а у отправителя буфер становится нулевой длины. Нужен одновременный доступ: SharedArrayBuffer и Atomics.

  • Без transfer list данные копируются.
  • process.env хранит только строки и не для данных.
  • У каждого воркера своя куча V8.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме