Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить подія message у worker?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Подія `message` спрацьовує, коли потік отримує дані через `postMessage()` - або з головного потоку, або від іншого воркера; це, по суті, «подія отримання даних». **Ключове:** обмін іде через серіалізацію (копію) даних, якщо не використовувати Transferable-об'єкти.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що робить подія `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')`. > > Це основа асинхронного обміну даними між головним потоком і воркерами.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.