MessagePort
- это часть API worker_threads
в Node.js, который позволяет организовать межпоточное взаимодействие (между Worker'ами). Это дуплексный канал связи, который можно использовать для передачи сообщений между потоками.
Worker
или через new MessageChannel()
MessagePort
(техника называется "transferring")const { Worker, MessageChannel } = require('worker_threads');
const { port1, port2 } = new MessageChannel();
// Worker 1
const worker = new Worker(`
const { parentPort, MessagePort } = require('worker_threads');
parentPort.on('message', (message) => {
message.port.postMessage('Hello from worker!');
});
`);
// Main thread
worker.postMessage({ port: port1 }, [port1]);
port2.on('message', (msg) => {
console.log(msg); // 'Hello from worker!'
});
BroadcastChannel
- это API, доступное как в браузере, так и в Node.js (с версии 15.4.0), которое позволяет осуществлять широковещательную рассылку сообщений между различными контекстами (вкладками, worker'ами, процессами).
const { BroadcastChannel } = require('worker_threads');
// Worker 1
const bc1 = new BroadcastChannel('my_channel');
bc1.postMessage('Hello everyone!');
// Worker 2
const bc2 = new BroadcastChannel('my_channel');
bc2.onmessage = (event) => {
console.log(event.data); // 'Hello everyone!'
};
Характеристика | MessagePort | BroadcastChannel |
---|---|---|
Направленность | Точечное соединение | Широковещательный |
Сложность | Требует настройки | Простое подключение |
Передача портов | Поддерживается | Не поддерживается |
Производительность | Выше (прямое соединение) | Ниже (широковещание) |
MessagePort
- для прямого обмена сообщениями между двумя конкретными потоками с возможностью передачи самого порта.BroadcastChannel
- для широковещательной рассылки сообщений всем подписчикам канала.Оба механизма используют алгоритм структурного клонирования, что позволяет передавать сложные объекты, но с некоторыми ограничениями (например, нельзя передать функции или объекты с методами).