Node.js
Многопоточность
Поиск…
Вступление
Node.js был спроектирован как однопоточный. Поэтому для всех практических целей приложения, запускаемые с помощью Node, будут работать в одном потоке.
Однако сам Node.js запускается многопоточно. Операции ввода-вывода и т.п. будут выполняться из пула потоков. Кроме того, любой экземпляр приложения-узла будет работать в другом потоке, поэтому для запуска многопоточных приложений запускается несколько экземпляров.
замечания
Понимание цикла событий важно понять, как и почему использовать несколько потоков.
кластер
Модуль cluster
позволяет запускать одно и то же приложение несколько раз.
Кластеризация желательна, когда разные экземпляры имеют один и тот же поток выполнения и не зависят друг от друга. В этом случае у вас есть один мастер, который может запускать вилки и вилки (или дети). Дети работают самостоятельно и имеют свое пространство в Раме и Event Loop.
Настройка кластеров может быть полезной для веб-сайтов / API. Любой поток может обслуживать любого клиента, так как он не зависит от других потоков. База данных (например, Redis) будет использоваться для совместного использования Cookies, поскольку переменные не могут использоваться совместно! между нитями.
// runs in each instance
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
console.log('I am always called');
if (cluster.isMaster) {
// runs only once (within the master);
console.log('I am the master, launching workers!');
for(var i = 0; i < numCPUs; i++) cluster.fork();
} else {
// runs in each fork
console.log('I am a fork!');
// here one could start, as an example, a web server
}
console.log('I am always called as well');
Детский процесс
Процессы Child - это путь, когда вы хотите запускать процессы независимо друг от друга с инициализацией и проблемами. Подобно forks в кластерах, child_process
работает в своем потоке, но, в отличие от forks, у него есть способ связаться со своим родителем.
Связь идет в обоих направлениях, поэтому родитель и ребенок могут прослушивать сообщения и отправлять сообщения.
Родитель (../parent.js)
var child_process = require('child_process');
console.log('[Parent]', 'initalize');
var child1 = child_process.fork(__dirname + '/child');
child1.on('message', function(msg) {
console.log('[Parent]', 'Answer from child: ', msg);
});
// one can send as many messages as one want
child1.send('Hello'); // Hello to you too :)
child1.send('Hello'); // Hello to you too :)
// one can also have multiple children
var child2 = child_process.fork(__dirname + '/child');
Ребенок (../child.js)
// here would one initialize this child
// this will be executed only once
console.log('[Child]', 'initalize');
// here one listens for new tasks from the parent
process.on('message', function(messageFromParent) {
//do some intense work here
console.log('[Child]', 'Child doing some intense work');
if(messageFromParent == 'Hello') process.send('Hello to you too :)');
else process.send('what?');
})
Рядом с сообщением можно прослушивать многие события, такие как «ошибка», «подключено» или «отключиться».
Запуск дочернего процесса имеет определенную стоимость, связанную с ним. Можно было бы создать как можно меньше из них.