Соответствующий поток пользователей Nodejs - PullRequest
2 голосов
/ 09 апреля 2020

Итак, я пытаюсь создать систему, в которой пользователи могут сопоставлять друг друга, указав c информацию. Я имею в виду следующий поток:

  1. пользователь 1 заполняет информацию и нажимает «найти»
  2. , в то время как пользователь 2 делает то же самое, что и пользователь 1
  3. , клиент отправляет запрос на сервер в маршруте / X, чтобы сервер мог сделать sh клиента в (потокобезопасную) очередь
  4. рабочий поток каждый раз вытаскивает из очереди и выполняет сопоставление
  5. , в то время как пользователь запрашивает маршрут / Y на сервере, чтобы получить его соответствие
  6. рабочий поток находит совпадение 2 пользователей и передает его в некоторую (поточно-безопасную) структуру данных
  7. в следующий раз, когда пользователь опрашивает сервер (в / Y), пользователь получает совпадение и перенаправляется на диалог

Итак, в первую очередь это хороший подход? а также использует ли рабочий поток и потокобезопасную структуру данных логически в javascript? (в частности, Nodejs и express), есть ли альтернативный или лучший способ сделать это?

спасибо.

1 Ответ

1 голос
/ 11 апреля 2020

Это плохой подход.

Вам не нужны (и не должны использоваться) рабочие потоки для вашего варианта использования.

В рабочих потоках

Рабочие потоки являются изолированными экземплярами Javascript, которые выполняются как отдельный поток. Они предназначены исключительно для выполнения ресурсоемких работ.

vs vanilla Node

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

Из документов : «Рабочие (потоки) полезны для выполнения ресурсоемких операций JavaScript. Они мало помогут в работе с интенсивным вводом / выводом. Встроенный Node.js - операции асинхронного ввода-вывода более эффективны, чем рабочие. "

Подробнее о многопоточности

Javascript является однопоточным и очень хорошо работает таким образом. В Javascript отсутствует понятие «потокобезопасности», потому что оно не нужно; Весь код является потокобезопасным.

Если у вас есть код, интенсивно использующий процессор

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

Разделение кода с интенсивным использованием процессора на отдельные программы часто является наиболее гибким решением. Это дает вам несколько вариантов:

  1. порождает новый экземпляр Node для запуска вашего кода, интенсивно использующего процессор (на том же сервере)
  2. для запуска кода, интенсивно загружающего процессор в облаке " «безсерверные» сервисы, такие как AWS Lambda
  3. превращают ваш ресурсоемкий код в «микросервис», по сути крошечный веб-сервер, который выполняет любую специализированную обработку и возвращает результат

Далее Чтение

Как работает асинхронность узла (общая картина) https://blog.insiderattack.net/event-loop-and-the-big-picture-nodejs-event-loop-part-1-1cb67a182810

Какие операции блокируют событие l oop и как его избежать https://nodejs.org/uk/docs/guides/dont-block-the-event-loop/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...