Как стать автором
Обновить

Комментарии 31

Опрос то можно посмотреть? Что ж там такое, что не прошли. Вангую, что очередные бредовые задачи типа «посчитайте в уме что из этих 100 строк сработает первым»

Здравствуйте, старался задавать фундаментальные вопросы, так как сам перешел из Java разработки

Некоторе вопросы, которые я задавал

А зачем вообще знать о том, используется ли там Event loop из V8 или из libuv? 🤔
  1. А зачем вообзе это знать программисту, если он не дорабатывает саму ноду?

  2. И да и нет. Вон ниже спрашивают про два параллельных запроса к БД. Это две асинхронные функции которые отправят два параллельных запроса. Но если в функциях чисто JS код, тогда нет, но если обернуть их в воркеры, то да. Условия задачи так себе.

  3. Подозреваю, что имеется ввиду завершение программы. Но никто такими понятиями по факту же не оперирует.

А io_uring вне досягаемости ноды?

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

Что-то переделанный пример похож на инструкцию как рисовать сову. Непонятно почему статичный запрос перестал висеть, когда его запрашивают в тот момент, когда запустился"тяжёлый" код в getStatistics. Особенно это интересно в свете того, что судя из статьи первым обрабатываются микротаски, а запрос приходит через network i/o, а это как я понимаю сидит примерно в фазе Pool и должно обрабатываться после микротасков?

Потому что надо читать текст статьи, а не только примеры кода. Автор предлагает выполнять "тяжелую" работу в отдельном процессе, в то время как для основного процесса метод getStatistics выполняет всего лишь HTTP-запрос, который много процессорного времени не требует.

По-моему это вы не читали статью. getStatistics и есть функция, выполняющая тяжёлую работу - расчет средней ЗП по всем сотрудникам всех компаний.

Читайте ещё раз:


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

Вон оно что, а я то всё думал, что тут автор имел ввиду? Оказывается отдельный веб сервер для сложной функции. Я подумал что тут имелась ввиду функция getStatistics со сложным кодом, а делегирование через async await.

Ну про воркеры то автор видимо не слышал. На худой конец кластеризация. Надо отдельный веб сервер запилить, да...

Возможно не веб сервер, а через exec вызывается новая нода которая всё посчитает и вернет результат. Честно сказать самому не хватило информации о том, как это реализовал автор

Ещё попутный вопрос. Классическая ситуация. Нужно получить данные по выбранной page и количество данных по выборке, чтобы посчитать количество pages. Имеет ли смысл выполнять эти запросы к бд в 2-х отдельных Promise и ждать выполнения обоих, чтобы вернуть данные, или можно не париться и сделать каждый с await? Всё равно ведь они попадают в микротаски (запрос к бд асинхронный), а там они выполняются последовательно, а не одновременно? Т.е. алгоритм по факту получается одинаков в обоих случаях, только по коду с promises кажется, что они выполняются параллельно, а с await последовательно?

Посмотрите как работает await. Это будет два последовательных запроса, что через then, что через await. Если хотите всё же два запроса асинхронно сделать, то используйте Promise.all или Promise.allSetled. Но учтите, что один коннкешн нельзя использовать в этом случае, то есть для каждого запроса должен быть свой коннект из пулла.

 Всё равно ведь они попадают в микротаски (запрос к бд асинхронный), а там они выполняются последовательно, а не одновременно? 

Одновременно. У libuv есть свой тред-пулл

НЛО прилетело и опубликовало эту надпись здесь

Кроме того, ничего не мешает комбинировать промисы с await

const [resA, resB] = await Promise.all([getData(1), getData(2)])

Если не ошибаюсь, синхронным консоль.логом из примера будет только "START". То что в then и после await - это микротаски

господи сколько знаний , костылей , кода , синхронизаций , ухищрений , зачем вам всё это? перейдите на нормальный язые программирования который из коробки поддерживает многопоточность например C#

зачем мультипоточность для асинхронных I/O?

Господи, откуда такая тяга всё усложнять?

Возможно, вы не в курсе, но в C#, кроме потоков, тоже есть async/await, и добавили их туда не просто так.

Нашёл интересную статью, где лучше раскрыта тема. https://snyk.io/blog/nodejs-how-even-quick-async-functions-can-block-the-event-loop-starve-io/

Promise и await не всегда обеспечивают асинхронность и в некоторых случаях блокировки происходят.

Большое спасибо за дополнение материала =)

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

Вы хотели сказать когда демультиплексор событий отправит новые события, нет?

Да, спасибо вам большое за точное замечание)

лол, в первом же примере ошибка) не будет никакого ожидания, потому что там пропущено await

На этом примере представлен псевдокод, работающий в одном потоке.
Но спасибо вам за замечание, пропишу этот момент более детально, чтобы двойственности не возникало =)

Отличный материал, спасибо!

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий