Перейти к содержанию

Процессы

Процесс запущенного Node.js приложения представлен глобальным объектом process, который является экземпляром класса EventEmitter и предоставляет полные данные о системе, параметрах запуска, переменных окружении и потребялемых процессом ресурсах.

Наиболее часто используемые свойства объекта process:

  • arch - архитектура процессора, на котором запущен Node.js процесс, возможные значения: arm, ia32, x64;
  • argv - массив с параметрами запуска процесса, причем вслед за элементом массива, который содержит параметр, будет элемент со значением этого параметра;
  • connected - булевое значение, значение установленное в true означает, что Node.js процесс был создан с IPC каналом (подробно здесь);
  • env - объект с пользовательским окружением;
  • pid - уникальный идентификатор процесса;
  • platform - платформа операционной системы, возможные значения: freebsd, linux, win32 и т. д.;
  • version - текущая версия Node.js.
1
2
console.log('Processor architecture: ', process.arch); // arm | ia32 | x62
console.log('Platform: ', process.platform); //win32 | linux | freebsd

Наиболее часто используемые методы объекта process:

  • cpuUsage() - возвращает объект с пользовательским и системным временем использования процесса в микросекундах, на основе которого можно рассчитать загрузку процессора в процентах, необязательным параметром может принимать свое предыдущее значение;
  • hrtime() - возвращает высоко точное время в виде массива с двумя элементами: секунды и наносекунды;
  • cwd() - возвращает рабочую директорию Node.js процесса;
  • disconnect() - отключает IPC канал от главного процесса и завершает дочерний;
  • exit() - завершает процесс при первой же возможности с заданным кодом (по умолчанию код завершения равен 0);
  • memoryUsage() - возвращает объект с данными об использовании Node.js процессом оперативной памяти, объект содержит свойства rss (отведенный под процесс объем памяти), heapTotal (объем памяти, отведенный под V8), heapUsed (объем памяти, используемый V8 в данный момент) и external (использование памяти объектами C++), все значения в байтах;
  • on() - метод обработки событий;
  • send() - используется для обмена сообщениями между основным и дочерними процессами (подробно здесь);
  • uptime() - возвращает количество миллисекунд, прошедшее с момента запуска процесса.

Пример расчета использования процессом процессора в процентах.

cpu-usage.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
const ns2ms = (ns) => ns * 1000000;

let startTime = process.hrtime();
let startCpuUsage = process.cpuUsage();

for (let i = 0; i < 10000000000; i++);

let diffTime = process.hrtime(startTime);
let diffUsage = process.cpuUsage(startCpuUsage);

let diffTimeMs = diffTime[1] * 1000 + ns2ms(diffTime[1]);
let diffUsageUserMs = ns2ms(diffUsage.user);
let diffUsageSystemMS = ns2ms(diffUsage.system);
let cpuUsage = Math.round(
    (100 * (diffUsageUserMs + diffUsageSystemMS)) /
        diffTimeMs
);

console.log('CPU usage, %: ', cpuUsage);

Наиболее часто используемые события объекта process:

  • beforeExit - инициируется, когда полностью заканчивается цикл событий;
  • disconnect - генерируется в дочернем процессе при закрытии канала IPC;
  • exit - инициируется при завершении процесса вызовом метода process.exit() или по завершению цикла событий;
  • message - может возникнуть только в главном процессе, когда в одном из дочерних процессов вызывается метод message();
  • uncaughtException - генерируется в случае возникновения необработанного исключения, но процесс при этом не завершается.

Событие beforeExit не возникнет, если процесс завершается в результате ошибки или вызовом метода process.exit().

Пример обработки uncaughtException.

1
2
3
4
5
6
process.on('uncaughtException', (err, origin) => {
    console.log('Error: ', err);
    console.log('Origin: ', origin);
});

nonExistingFunction();

Коды завершения Node.js процесса:

  • 1 - исключение, которое не обработано ни JavaScript, ни обработчиком события uncaughtException;
  • 3, 4, 10 - означают ошибки исходного кода JavaScript, обычно встречаются только при разработке самой платформы Node.js;
  • 5 - критическая ошибка V8;
  • 6 - необработанное исключение не попало в обработчик критических исключений;
  • 7 - возникновение ошибки в обработчике критических исключений;
  • 9 - используется, если были неправильно заданы аргументы;
  • 12 - возникает в режиме отладки при некорректном указании порта.
1
2
3
4
5
process.on('exit', (code) =>
    console.log(`Exit code: ${code}`)
);

nonExistingFunction();

В случае завершения цикла событий процесс завершается с кодом 0.

С полным списком свойств, методов и событий Node.js процесса можно ознакомиться на официальном сайте.

В случаях, когда часто выполняются блокирующие основной процесс операции, лучше доверить их выполнение дочерним процессам.