Процессы¶
Процесс запущенного 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.
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
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
.
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
- возникает в режиме отладки при некорректном указании порта.
process.on('exit', (code) =>
console.log(`Exit code: ${code}`)
)
nonExistingFunction()
В случае завершения цикла событий процесс завершается с кодом 0
.
С полным списком свойств, методов и событий Node.js процесса можно ознакомиться на официальном сайте.
В случаях, когда часто выполняются блокирующие основной процесс операции, лучше доверить их выполнение дочерним процессам.