Тут мы для загрузки системы написали поиск факториала массива чисел
factorial.ts
app.ts
Как итог: мы на 2 секунды заблокировали основной поток нашего приложения и не могли получать ни реквесты от пользователей, ни какие-либо операции выполнять (те же таймауты)
Далее воспользуемся созданием воркеров
Это всё так же сама наша функция для выполнения вычислений
factorial.js
Этот модуль будет отвечать за задачу, выполняемую отдельным воркером
worker.js
А уже тут мы используем промисы для ожидания ответа от нашего воркера
app-worker.js
И уже конкретно тут можно увидеть, что задача выполнилась почти в 3 раза быстрее, чем без разделения на потоки. Так же тут у нас будут отрабатывать вызванные таймауты и приниматься реквесты от пользователей.
024 Spawn и exec
Модуль exec позволяет нам работать с нашим терминалом. Первым аргументом в него мы передаём саму команду, которую мы хотели бы выполнить, например, ls для вывода содержимого директории или ту же команду по запуску нод-скриптов node app.js. Дальше уже принимает в себя функция коллбэк-функцию с ошибкой приложения, выводом консоли и ошибкой консоли.
Мы так же можем реагировать на ивенты с созданным таким образом процессом.
Сам же модуль spawn сразу вызывает функцию в консоли и уже после мы можем обработать полученный результат из консоли по отдельным его частям
025 Fork
Модуль fork позволяет запустить указанный файл для выполнения в отдельном потоке (это альтернативный запуск воркер-процесса)
Конкретно тут была реализована задача отправки сообщения в другой процесс (fork.js), откуда поступает ответ родителю при получении сообщения от родителя.
app.js
Уже тут при получении сообщения будет реализована логика как отправки сообщения, так и отключения процесса, если поступит запрос от родителя "disconnect"
fork.js
026 Упражнение - Производительность потоков
Это сам модуль для реализации загруженности системы
factorial.js
Отправляет результат вычислений по запросу от родителя. Родитель отправляет просто сообщение.
fork.js
Ну и второй процесс, который так же реализует подсчёт значений по запросу родителя. Родитель отправляет сообщение в виде объекта.
worker.js
Это первая версия приложения, которая просто запускает оба вида создания потоков
app.js
Как можно увидеть - разница между обоими выполнениями операций не так велика
И тут нужно поговорить про концептуальне отличия форка и воркера:
Форк - это отдельный инстанс ноды, а воркер - это просто новый поток в том же процессе ноды
Для коммуниации между форками используется отдельный IPC канал, а для воркера уже используется просто общая память с нодовским процессом
Если говорить итогово, то форк стоит использовать только для очень больших процессов, так как он имеет хоть и небольшой, но оверхед. Если нужно реализовать небольшой процесс, то тут воркер может спасти некоторое количество миллисекунд.
И далее используем пример, в котором мы уже добавим видео для передачи между нашими процессами
app.js
И сейчас разница во времени между выполняемыми процессами стала более заметной. Дело опять же в том, что воркер используется общую память с основным процессом, что позволяет более быстро выполнять операции передачи данных. Форк же, в свою очередь, ппередаёт данные по IPC каналу, что сильно стопорит процесс передачи данных.
Если получится, то стоит всегда использовать на практике воркеры
Однако, если мы используем воркеры, то нам нужно их будет создать и выделить заранее, чтобы не образовывать уязвимости для наших серверов (их легко будет заDDOSить)