JavaScript Worker.postMessage() — передати дані у фоновий потік


Метод postMessage() передає дані фоновому потоку — і назад.

автор: NagarD

Загальний опис

Дані копіюються, а не поділяються. Це не поверхнева копія: структура клонується цілком, включно з вкладеними об'єктами, Map, Set і датами.

Але клонувати можна не все. Функції, DOM-елементи й класи з методами не передаються — спроба кидає DataCloneError. Передавати можна лише дані, не поведінку.

І головне про продуктивність: копіювання коштує часу. Передати 100 МБ означає їх скопіювати — а це може з'їсти весь виграш від фонового потоку.

Рятує другий аргумент — список передачі. ArrayBuffer можна не копіювати, а передати: він миттєво «переїжджає» в робітника, а у відправника стає порожнім.

автор: NagarD

Порада

Ганяєш великі двійкові дані — передавай буфер другим аргументом: worker.postMessage(buffer, [buffer]). Це миттєво, бо копіювання не відбувається взагалі.

автор: NagarD

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
postMessage 4+ 3.5+ 4+ 11.5+ 12+ 10+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
postMessage 4.4+ yes yes 5+

Приклади

+ запропонувати свій приклад у пісочниці

Копіювання, передача без копіювання й те, що не передається.

const worker = new Worker('/worker.js');

// копіюється — структура клонується цілком
worker.postMessage({ items: [1, 2, 3], when: new Date() });

// а це кине DataCloneError
// worker.postMessage({ fn: () => {} });
// worker.postMessage({ node: document.body });

// великі дані — ПЕРЕДАЄМО, не копіюємо
const buffer = new ArrayBuffer(100 * 1024 * 1024);

worker.postMessage(buffer, [buffer]); // миттєво

console.log(buffer.byteLength); // 0 — буфер «переїхав»
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід