Що робить подія 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.