Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   тяжеловесный запрос (https://javascript.ru/forum/node-js-io-js/83612-tyazhelovesnyjj-zapros.html)

fxobject 25.01.2022 07:23

тяжеловесный запрос
 
Уважаемые господа!
Предстоит переработка тяжеловесного запроса с java на node. В зависимости от состояния базы данных запрос может длится от нескольких минут до десятков минут (от 20 до 30 минут).
Собственно вопрос вот в чем. Node - это однопоточное чудовище, т.е. в это время будет заблокирована вся работа системы (не путать с ОС).
Собственно идея - на каждой итерации цикла уходить в очередь Node и в следующий свободный цикл продолжать выполнение.
Как продолжить примерно знаю.... примерно. Но вот как уйти. Вообще соображениями если поделитесь буду благодарен
Спасибо

fxobject 25.01.2022 07:29

кстати где то прочел, что node уже не однопоточен. последняя версия вроде бы предоставляет возможности работы с потоками. кто-нибудь, что-нибудь подскажет по этому поводу?

ksa 25.01.2022 11:34

Цитата:

Сообщение от fxobject
Node - это однопоточное чудовище, т.е. в это время будет заблокирована вся работа системы

Что такое ты собираешься вычислять так долго?
Т.к. в ноде есть еще асинхронность, которую ты, вроде как, не собираешься использовать...

ksa 25.01.2022 11:35

Хотя ты на своей волне и тебе что-то советовать - только портить. :D

fxobject 25.01.2022 18:35

Ох уж эти преподаватели. У них студенты всегда тупее их самих. При больших объемах вычислений никакая асинхронность вам не поможет. Хотя бы потому что код большого количества вычислений будет держать node машину и никаких асинхронных операций не будет происходить пока не закончится код. И это никакая вообще не асинхронность. Если уважаемый преподаватель вы изучали программирование то должны понимать что асинхронность возникает например в прерываниях обработки от устройств, в многопоточных процессах но никак не в однопоточной задачи NODE. Node реализована в виде обработки очередей и складывается ощущение что это асинхронность. Банан вам за теорию.
Соответственно задача с большими вычислениями на node решается двумя путями
1 вариант : делите свой код на части. например на итерации цикла. И для каждого цикла используете функцию setImmediate(). Но это не асинхронность (в прямом смысле этого слова)
2 вариант используете многопоточность. node оказывается давно умеет это делать. Используется модуль worker_threads. ну и просто читаем как он работает.
Уважаемый учитель! Если мне что то советовать - только портить что то там, очень обяжете если мои вопросы будете просто обходить мимо. Я не нуждаюсь в вашей помощи, а вы просто гадите.
Без хамства вы просто не можете. Обратите внимание я до сих пор обращаюсь к вам на Вы, хоты вы с самого начала тыкаете мне. У вас нет на это права ни как у старшего, ни как у (тем более) специалиста. Вы даже не пытаетесь вникнуть в суть вопроса. Ваша доминантность просто зашкаливает.

ksa 25.01.2022 20:27

У нас свободный форум... Но с тобой точно не стоит вообще иметь дело. :D

voraa 26.01.2022 08:05

Цитата:

Сообщение от fxobject
В зависимости от состояния базы данных....

Цитата:

Сообщение от fxobject
что асинхронность возникает например в прерываниях обработки от устройств

Цитата:

Сообщение от fxobject
Node реализована в виде обработки очередей ...

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

Alexandroppolus 26.01.2022 19:42

fxobject,
для справки.

1)
longQuery(params, (response) => { ... })

Запрос "куда-то туда". В базу данных, на другой сервер, в файловую систему, пересылка данных по сети... Здесь на отрезке времени от вызова longQuery и до срабатывания колбэка (функции, в которую будет передан response) Node не блокируется, не простаивает. Она вообще забывает про отправленный запрос и занимается своими делами - обработкой других запросов. Потому longQuery безболезненно запускается в основном потоке.

2)
const response = bigCalculationWithLongCycle(params);

это синхронные вычисления. Они заблокируют ноду. Поэтому вот их надо в отдельном воркере. Воркер отработает параллельно и закинет результат в основной поток. Над этой штукой можно легко сделать обертку, подобную п.1, с философией "запрос в другой поток за результатом вычислений", ну ты понял. А ещё правильнее всё потом промисифицировать для пущего удобства.

Если у тебя вперемешку и то и другое, то декомпозируй на функции-запросы и функции-вычисления, после чего пп. 1 и 2.


Часовой пояс GMT +3, время: 10:00.