JavaScript Worker.postMessage() — передати дані у фоновий потік
Метод postMessage() передає дані фоновому потоку — і назад.
Загальний опис
Дані копіюються, а не поділяються. Це не поверхнева копія: структура клонується цілком, включно з вкладеними об'єктами, Map, Set і датами.
Але клонувати можна не все. Функції, DOM-елементи й класи з методами не передаються — спроба кидає DataCloneError. Передавати можна лише дані, не поведінку.
І головне про продуктивність: копіювання коштує часу. Передати 100 МБ означає їх скопіювати — а це може з'їсти весь виграш від фонового потоку.
Рятує другий аргумент — список передачі. ArrayBuffer можна не копіювати, а передати: він миттєво «переїжджає» в робітника, а у відправника стає порожнім.
- Порада
-
Ганяєш великі двійкові дані — передавай буфер другим аргументом:
автор: NagarDworker.postMessage(buffer, [buffer]). Це миттєво, бо копіювання не відбувається взагалі.
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| postMessage | 4+ | 3.5+ | 4+ | 11.5+ | 12+ | 10+ |
| Переглядач | ||||
|---|---|---|---|---|
| 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 — буфер «переїхав»
Коментарі
Коментарів ще немає — будьте першим!