Есть ли способ сделать многопоточное кодирование в NodeJS?

Основываясь на моем понимании, только I/O в NodeJS не блокирует. Если мы делаем, например, множество тяжелых математических операций, другие пользователи не могут получить доступ к серверу до тех пор, пока это не закончится.

Мне было интересно, есть ли неблокирующий способ выполнения тяжелых вычислений в NodeJS? Просто любопытно.

Ответы

Ответ 1

Если у вас есть длительные вычисления, которые вы хотите сделать с Node, вам нужно будет запустить отдельный процесс для обработки этих вычислений. Как правило, это можно было бы сделать, создав несколько отдельных рабочих процессов и передав их вычисления. Делая это, вы не разблокируете основной цикл событий Node.

На стороне реализации вещей у вас есть два основных варианта.

  • Первое, что вы вручную отфильтровываете дочерние процессы, используя Node API-интерфейс дочернего процесса. Это хорошо, потому что ваши вычисления даже не должны быть javascript. Детский процесс, выполняющий вычисления, может быть даже C или что-то еще.
  • В качестве альтернативы Спецификация Web Worker имеет несколько реализаций, доступных через NPM, если вы найдите "рабочий" . Я не могу говорить о том, насколько хорошо они работают, поскольку я не использовал их, но они, вероятно, подходят.

Update

Теперь я бы выбрал вариант. Текущие API-интерфейсы дочерних процессов поддерживают отправку сообщений и объектов между процессами легко, подобно работнику, поэтому нет оснований использовать отдельный рабочий модуль.

Ответ 2

Вы можете использовать Hook.io для запуска отдельного процесса node для ваших тяжелых вычислений и обмена данными между ними. Hook.io особенно полезен, потому что он имеет автоматическое исцеление сетки, что означает, что если один из ваших крючков (процессов) сработает, его можно перезапустить автоматически.

Ответ 3

Используйте несколько экземпляров NodeJS и обменивайтесь данными сокетами.

Ответ 4

Используйте несколько экземпляров node и обменивайтесь данными через node -zeromq, HTTP, простые TCP-сокеты, IPC (например, сокеты домена unix), JSON-RPC или другие средства. Или используйте API веб-рабочих, как было предложено выше.

Многопользовательский подход имеет свои преимущества и недостатки. Недостатки заключаются в том, что существует бремя запуска этих случаев и осуществления собственных протоколов обмена. Преимущества заключаются в том, что масштабирование для многих компьютеров (в отличие от многих ядер/процессоров на одном компьютере) возможно.

Ответ 5

Я думаю, что это путь к концу, но это удивительная особенность nodejs, о которой вы должны знать.

Единственный способ многопоточности - создавать нереализованные новые процессы. Но у nodejs есть реализованная функция сообщения между порожденными node -forks. http://nodejs.org/docs/latest/api/child_processes.html#child_process.fork Отличная работа от разработчиков, вы можете передавать объекты и т.д. Как сообщение своим детям и назад

Ответ 7

Я бы использовал JXCore - это движок, основанный на полированном узле, который запускает ваш код, но имеет несколько параметров, включая многопоточность, которую вы ищете. Запуск этого в производстве - это очарование! Источник проекта: https://github.com/jxcore/jxcore

Особенности включают:

  • Поддержка основных функций Node.JS
  • Встраиваемый интерфейс
  • Опубликовать на мобильных платформах (Android, iOS..)
  • Поддержка нескольких JavaScript-движков
  • Возможности многопоточности
  • Конфигурация и мониторинг процессов
  • Файловая система в памяти
  • Упаковка приложений
  • Поддержка последних функций JavaScript (ES6, ASM.JS...)
  • Поддержка универсальной платформы Windows (uwp) api