Есть ли способ сделать многопоточное кодирование в 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
Отличная работа от разработчиков, вы можете передавать объекты и т.д. Как сообщение своим детям и назад
Ответ 6
Вы можете использовать кластерный модуль node.
https://nodejs.org/api/cluster.html
Ответ 7
Я бы использовал JXCore - это движок, основанный на полированном узле, который запускает ваш код, но имеет несколько параметров, включая многопоточность, которую вы ищете. Запуск этого в производстве - это очарование!
Источник проекта: https://github.com/jxcore/jxcore
Особенности включают:
- Поддержка основных функций Node.JS
- Встраиваемый интерфейс
- Опубликовать на мобильных платформах (Android, iOS..)
- Поддержка нескольких JavaScript-движков
- Возможности многопоточности
- Конфигурация и мониторинг процессов
- Файловая система в памяти
- Упаковка приложений
- Поддержка последних функций JavaScript (ES6, ASM.JS...)
- Поддержка универсальной платформы Windows (uwp) api