node.js рано или поздно сталкивались с важной особенностью этой платформы, а именно - однопоточностью.
Всё верно, один запущенный процесс - один поток. А как же быть если я хочу использовать все 14 ядер в моём супер облаке? Есть несколько способов обойти ограничение платформы. Например, можно запустить несколько процессов на разных портах и балансировать их через nginx или даже "родными" средствами вроде bouncy ( https://github.com/substack/bouncy ). Но это подход "в лоб", имеющий свои нюансы и ограничения, а также усложняющий запуск приложения. Создатели node.js позаботились о разработчиках и создали модуль Cluster. Модуль находится в процессе разработки и имеет статус 2 - Unstable, это означает что все основные проблемы решены, API "устаканивается", но пока недостаточно обкатан "в реальном мире". Обратная совместимость будет соблюдаться (в большинстве случаев), что говорит нам о том, что можно смело начинать использовать модуль в продакшн-сфере. Главная функция модуля - создание мастер-процесса и любого количества дочерних. Эти процессы могут делить одно http соединение и не только. Подробнее об этом можно почитать в официальной документации. Я же хочу рассказать об одной особенности использования fork'ов. Fork - дочерний процесс (в большинстве случаев копия текущего). При его создании ему можно передать переменные окружения (объект env). Это удобно для передачи уникального идентификатора процесса, что облегчает последующую отладку, так как вы сможете знать какой именно процесс столкнулся с той или иной ситуацией. В моём окружении всё работало превосходно, я запускал столько форков сколько мне было нужно, определяя необходимое количество через удаленную панель управления. Однажды у меня возникла необходимость использования сторонней консольной утилиты, а именно - GraphicsMagick. В локальной песочнице мой код работал отлично, изображения конвертировались, не было и намека на то что что-то может пойти не так, но как только я запустил скрипт в полноценном окружении я обнаружил что процесс не видит установленный GM. Я долго ходил вокруг да около, пока не вывел в консоль значение переменной окружения - $PATH. Моё удивление не знало границ когда я обнаружил что переменная пустая. Я попробовал вывести всё окружение и обнаружил там лишь forkId, который я бережно передал туда при создании форка :) Да, именно так. При создании дочернего процесса, по умолчанию он не наследует окружение родителя, а значит и переменную $PATH. Передача PATH в окружение форка решила мою проблему. GraphicsMagick был увиден и изображения обработаны. Удачной разработки :) #node #js #fork #cluster #path #environment
Дневники программиста
:Владислав Коротун
Те кто занимались разработкой на
node.js рано или поздно сталкивались с важной особенностью этой платформы, а именно - однопоточностью.
Всё верно, один запущенный процесс - один поток. А как же быть если я хочу использовать все 14 ядер в моём супер облаке?
Есть несколько способов обойти ограничение платформы. Например, можно запустить несколько процессов на разных портах и балансировать их через nginx или даже "родными" средствами вроде bouncy ( https://github.com/substack/bouncy ).
Но это подход "в лоб", имеющий свои нюансы и ограничения, а также усложняющий запуск приложения.
Создатели node.js позаботились о разработчиках и создали модуль Cluster.
Модуль находится в процессе разработки и имеет статус 2 - Unstable, это означает что все основные проблемы решены, API "устаканивается", но пока недостаточно обкатан "в реальном мире". Обратная совместимость будет соблюдаться (в большинстве случаев), что говорит нам о том, что можно смело начинать использовать модуль в продакшн-сфере.
Главная функция модуля - создание мастер-процесса и любого количества дочерних. Эти процессы могут делить одно http соединение и не только. Подробнее об этом можно почитать в официальной документации. Я же хочу рассказать об одной особенности использования fork'ов.
Fork - дочерний процесс (в большинстве случаев копия текущего). При его создании ему можно передать переменные окружения (объект env). Это удобно для передачи уникального идентификатора процесса, что облегчает последующую отладку, так как вы сможете знать какой именно процесс столкнулся с той или иной ситуацией.
В моём окружении всё работало превосходно, я запускал столько форков сколько мне было нужно, определяя необходимое количество через удаленную панель управления.
Однажды у меня возникла необходимость использования сторонней консольной утилиты, а именно - GraphicsMagick.
В локальной песочнице мой код работал отлично, изображения конвертировались, не было и намека на то что что-то может пойти не так, но как только я запустил скрипт в полноценном окружении я обнаружил что процесс не видит установленный GM.
Я долго ходил вокруг да около, пока не вывел в консоль значение переменной окружения - $PATH. Моё удивление не знало границ когда я обнаружил что переменная пустая. Я попробовал вывести всё окружение и обнаружил там лишь forkId, который я бережно передал туда при создании форка :)
Да, именно так. При создании дочернего процесса, по умолчанию он не наследует окружение родителя, а значит и переменную $PATH.
Передача PATH в окружение форка решила мою проблему. GraphicsMagick был увиден и изображения обработаны.
Удачной разработки :)
#node #js #fork #cluster #path #environment