Вопрос проверяет знание способов обмена данными между потоками в JavaScript.
Основной поток и Web Worker общаются через асинхронные сообщения с помощью postMessage и события onmessage. Данные передаются копированием (не общей памятью), если не используется SharedArrayBuffer.
Механизм взаимодействия:
postMessage(data) — отправка данных из одного потока в другой.
onmessage — обработчик для получения данных.
Пример:
// Основной поток
const worker = new Worker('worker.js');
worker.postMessage({ command: 'sum', numbers: [1, 2, 3] });
worker.onmessage = (e) => {
console.log('Sum:', e.data); // Получит 6
};
// Web Worker (worker.js)
onmessage = (e) => {
if (e.data.command === 'sum') {
const sum = e.data.numbers.reduce((a, b) => a + b, 0);
postMessage(sum);
}
};Особенности:
Данные передаются копированием (сериализуются через structured cloning).
Для передачи больших данных без копирования можно использовать SharedArrayBuffer (но это требует синхронизации через Atomics).
Сообщения асинхронны: отправка через postMessage не блокирует поток.