Middle+
Как се реализира многопоточността в Node.js?
sobes.tech AI
Отговор от AI
Node.js по своята природа е еднонишков за изпълнение на потребителски JavaScript код. Многозадачността се постига чрез неблокиращ вход/изход и Event Loop. Многопоточността за изпълнение на тежки задачи се реализира с модула worker_threads.
Event Loop:
- Основен механизъм за асинхронни операции.
- Еднонишков цикъл, който обработва callback-и, свързани с I/O операции, таймери и други асинхронни събития.
Worker Threads:
- Позволяват изпълнение на паралелни тежки CPU-bound задачи.
- Всеки работник стартира своя собствен V8 JavaScript двигател в отделен поток.
- Общуването между основния поток и работниците става чрез изпращане на съобщения (postMessage, receiveMessage).
Сравнение:
| Механизъм | Назначение | Паралелизъм | Изолация на състояния | Използване на памет | Сложност | По-подходящо за |
|---|---|---|---|---|---|---|
| Event Loop | Асинхронен I/O | Конкурентност | Общо състояние | Ефективно | Ниска | I/O-зависими задачи |
| Worker Threads | CPU-зависими изчисления | Паралелизъм | Изолирано | Повече | Средна | CPU-зависими задачи |
Пример за използване на worker_threads:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// Това е основният поток
const worker = new Worker(__filename); // Създаване на работник с същия файл
worker.on('message', (msg) => {
console.log(`Съобщение от работника: ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`Работникът приключи с код ${code}`);
});
worker.postMessage('Здравей, работник!'); // Изпращане на съобщение към работника
} else {
// Това е работникът
parentPort.on('message', (msg) => {
console.log(`Съобщение от основния поток: ${msg}`);
parentPort.postMessage('Здравей, основен поток!'); // Изпращане на отговор
});
}
Event Loop се управлява на ниво Node.js и libuv, докато worker_threads предоставя API за явното създаване и управление на нишки за изпълнение на JavaScript код.