Skip to main content

Що робить подія message у worker?

Що робить подія message

Подія message спрацьовує, коли потік (Worker) отримує дані через метод postMessage()

  • або з основного потоку, або з іншого воркера.

Простіше кажучи:

message - це "подія отримання даних".

1. Взаємодія потоків

У Node.js модуль worker_threads надає:

  • Worker (в основному потоці)
  • і parentPort (усередині воркера)

Вони можуть надсилати й приймати повідомлення:

  • worker.postMessage() - надіслати повідомлення в потік
  • worker.on('message') - отримати відповідь з потоку
  • parentPort.postMessage() - надіслати повідомлення назад у головний потік
  • parentPort.on('message') - отримати повідомлення від нього

2. Приклад - обмін повідомленнями

main.js

javascript
const { Worker } = require('worker_threads'); const worker = new Worker('./worker.js'); // 1. Надсилаємо дані в потік worker.postMessage({ name: 'Tim', numbers: [1, 2, 3] }); // 2. Слухаємо відповідь від потоку worker.on('message', (result) => { console.log('Відповідь від воркера:', result); });

worker.js

javascript
const { parentPort } = require('worker_threads'); // 3. Слухаємо вхідне повідомлення parentPort.on('message', (data) => { const sum = data.numbers.reduce((a, b) => a + b, 0); // 4. Надсилаємо результат назад parentPort.postMessage({ greeting: `Привіт, ${data.name}!`, sum }); });

Тут:

  • main.js викликає worker.postMessage() → потік отримує повідомлення.
  • У потоці спрацьовує подія message → обробляємо дані.
  • Потім потік надсилає результат назад → в головному потоці спрацьовує worker.on('message').

3. Схема потоку даних

javascript
Головний потік (main) │ worker.postMessage(data) Воркер (worker) │ parentPort.on('message', handler) Обробка даних... │ parentPort.postMessage(result) Головний потік отримує → worker.on('message', handler)

4. Приклад двосторонньої комунікації

main.js

javascript
const { Worker } = require('worker_threads'); const worker = new Worker('./worker.js'); worker.on('message', msg => { console.log('Повідомлення від воркера:', msg); if (msg === 'готово') worker.terminate(); }); worker.postMessage('почни роботу');

worker.js

javascript
const { parentPort } = require('worker_threads'); parentPort.on('message', (msg) => { if (msg === 'почни роботу') { console.log('Воркер отримав команду'); parentPort.postMessage('готово'); } });

Тут головний потік і воркер обмінюються повідомленнями в обидва боки.

5. Формат переданих даних

Метод postMessage() може передавати:

  • будь-які серіалізовані дані (об'єкти, масиви, рядки, числа),
  • ArrayBuffer, TypedArray, SharedArrayBuffer,
  • і навіть Transferable об'єкти (передача без копіювання).

6. Важливо пам'ятати

  • Подія message викликається щоразу, коли надходить нове повідомлення.
  • Між потоками немає спільної пам'яті (якщо не використовується SharedArrayBuffer).
  • Обмін іде через механізм message passing (передачу повідомлень, а не спільних змінних).
  • Об'єкти передаються за значенням (копіюються), якщо не використовувати Transferable об'єкти.

7. Коротке резюме

ЕлементДе використовуєтьсяПризначення
worker.on('message', cb)В головному потоціОтримання повідомлень від воркера
worker.postMessage(data)В головному потоціНадсилання даних у воркер
parentPort.on('message', cb)Усередині воркераОтримання повідомлень з головного потоку
parentPort.postMessage(data)Усередині воркераНадсилання повідомлень назад

Підсумок

ХарактеристикаОпис
Що робить messageСпрацьовує, коли потік отримує дані
Де використовуєтьсяУсередині воркера (parentPort.on('message')) чи в головному потоці (worker.on('message'))
Як надсилати даніЧерез postMessage()
Передача данихЧерез серіалізацію чи Transferable об'єкти
НапрямокДвосторонній (main ↔ worker)
ЗастосуванняКомунікація між потоками без спільної пам'яті

Висновок:

Подія message - це спосіб "розмови" між потоками в Node.js. Коли один потік викликає postMessage(), інший отримує це повідомлення через обробник on('message').

Це основа асинхронного обміну даними між головним потоком і воркерами.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.