Рубрики
Uncategorized

Мой опыт с параллелизмом при написании пакета NPM.

Как использовать каждое ядро на вашем компьютере, используя NODEJS, каждая работа занимает секунды для завершения, которая находится … Tagged с узлом, JavaScript, WebDev, Devops.

Как использовать каждое ядро на вашем компьютере, используя nodejs

Каждая работа занимает секунды для завершения, которая дорогая в долгосрочной перспективе. Теперь требуется меньше минуты для 3000 рабочих мест! Это окончательный результат.

Задний план

Вы, вероятно, использовали другие языки, которые имеют дружественные для мультитасных сложных рабочих мест. К сожалению, делать это в JavaScript всегда сложно.

В течение более длинного времени JavaScript и Nodejs были ограничены контуром события. Код выполняет асинхронно, но не в истинной параллельной моде. Тем не менее, что изменилось с выпуском рабочих нитей в Nodejs.

Открывая эту концепцию, я сразу хочу проверить его полную способность. К сожалению, существующие библиотеки являются чрезмерно сложными и/или отсутствуют истинные параллельные возможности.

Цель

Я хочу посылку, который идеально подходит для небольших проектов. То, что обеспечивает очередь вакансий, не полагаясь на базы данных или файловую систему при доказании очевидной производительности.

Проблема

Многие пакеты являются полупаженной реализацией параллелизма. Например, Некоторые пакеты имеют код, который выглядит так.

Вышеуказанный код неверный, потому что оно оставляет некоторые распространенные краевые случаи:

  • Что произойдет, если бассейн должен внезапно расторгнуть?
  • Что произойдет, если количество рабочих мест меньше, чем количество потоков?
  • Что, если одна работа занимает значительно дольше, чем другая?

Последний вопрос — гвоздь в гробу. Если большинство рабочих мест займет 2 секунды для обработки, но займет 3 часа, то весь пул должен ждать 3 часа, пока все работники не будут освобождены.

Некоторые библиотеки работают вокруг этой проблемы, нередивших дополнительных работников, но это означает, что разработчик не хватает полного контроля над количеством работников. Бассейн должен быть детерминированным.

Первоначальные решения

С Обещание. Все блокируется, я сразу подумал, что Обещание. Любитель или Обещание Должен быть ответ на истинное параллельность, но я был неправ. На самом деле нет Обещание Только методы достаточно достаточно для многозадачности.

Так что это урегулировано, Обещание.race вероятно, решение, а Обещание. Любитель ошибочно, потому что Обещание. Любитель Должен успешно завершить хотя бы на обещание или ждать всех потерпеть неудачу.

Что произойдет, если все рабочие места терпят неудачу, кроме того, что занимает 3 часа? Опять же, весь бассейн должен подождать за 3 часа до завершения работы или приводит к Агрегатная ошибка Отказ

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

Работа удерживает нить

Решение для Обещание.race Проблема сами рабочие. Неважно, когда обещание решает, потому что работник работает на заднем плане.

Мое решение, каждый работник принимает идентификатор нити из бассейна. Когда работник заканчивает выполнение, это дает ID обратно. Это позволяет бассейну динамически распределять потоки.

Остановка

Последняя цель останавливает все исполнения бассейна. Даже если работает 3-часовая работа, она немедленно останавливается. Честно говоря, это сложнее понять, как другие проблемы с обещаниями.

Мой первый инстинкт отвергает обещание, но это проблематично. Я заметил, что прохождение Причины через Отклонить Звоните означало Обещание может только решить один причина . Тем не менее, многообещающие все причины возвращают меня на чертежную доску.

Еще хуже, отвергая обещание позволяет прервать основной цикл событий, но рабочие превращаются в зомби! 3 часа спустя — работник до сих пор забивает ваш терминал!

К счастью, я сделал открытие. Темы должны явно прекратить работник. Это делает процесс завершения полностью детерминированным, таким образом, никаких данных укомплектована. Обещание разрешается после того, как гонка обещания работы оседает.

Успех проекта!

Все тесты проходят, и я встретил мои цели! Бассейн рабочих выполняет работу асинхронно без каких-либо внешних инструментов. Это на НПМ. Если вы заинтересованы в том, как использовать библиотеку, продолжайте чтение!

npm install jpool

Функции

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

Основной пример (Main.js)

Наполнять Пример (job.js)

Увидеть разницу!

Каждое оконное окно обрабатывает тот же набор рабочих мест. Слева направо, программы используют 1, 8 и 256 работников. Темы увеличивают использование памяти, но выгоды стоят этого!

Конец

Документация нуждается в работе, в противном случае пакет кажется стабильным для V1.0.0. Если вы хотите помочь, я принимаю PRS. Спасибо за чтение!

https://github.com/wadez/jpool

Оригинал: «https://dev.to/wadecodez/running-jobs-in-parallel-using-nodejs-2142»