тяжеловесный запрос
Уважаемые господа!
Предстоит переработка тяжеловесного запроса с java на node. В зависимости от состояния базы данных запрос может длится от нескольких минут до десятков минут (от 20 до 30 минут). Собственно вопрос вот в чем. Node - это однопоточное чудовище, т.е. в это время будет заблокирована вся работа системы (не путать с ОС). Собственно идея - на каждой итерации цикла уходить в очередь Node и в следующий свободный цикл продолжать выполнение. Как продолжить примерно знаю.... примерно. Но вот как уйти. Вообще соображениями если поделитесь буду благодарен Спасибо |
кстати где то прочел, что node уже не однопоточен. последняя версия вроде бы предоставляет возможности работы с потоками. кто-нибудь, что-нибудь подскажет по этому поводу?
|
Цитата:
Т.к. в ноде есть еще асинхронность, которую ты, вроде как, не собираешься использовать... |
Хотя ты на своей волне и тебе что-то советовать - только портить. :D
|
Ох уж эти преподаватели. У них студенты всегда тупее их самих. При больших объемах вычислений никакая асинхронность вам не поможет. Хотя бы потому что код большого количества вычислений будет держать node машину и никаких асинхронных операций не будет происходить пока не закончится код. И это никакая вообще не асинхронность. Если уважаемый преподаватель вы изучали программирование то должны понимать что асинхронность возникает например в прерываниях обработки от устройств, в многопоточных процессах но никак не в однопоточной задачи NODE. Node реализована в виде обработки очередей и складывается ощущение что это асинхронность. Банан вам за теорию.
Соответственно задача с большими вычислениями на node решается двумя путями 1 вариант : делите свой код на части. например на итерации цикла. И для каждого цикла используете функцию setImmediate(). Но это не асинхронность (в прямом смысле этого слова) 2 вариант используете многопоточность. node оказывается давно умеет это делать. Используется модуль worker_threads. ну и просто читаем как он работает. Уважаемый учитель! Если мне что то советовать - только портить что то там, очень обяжете если мои вопросы будете просто обходить мимо. Я не нуждаюсь в вашей помощи, а вы просто гадите. Без хамства вы просто не можете. Обратите внимание я до сих пор обращаюсь к вам на Вы, хоты вы с самого начала тыкаете мне. У вас нет на это права ни как у старшего, ни как у (тем более) специалиста. Вы даже не пытаетесь вникнуть в суть вопроса. Ваша доминантность просто зашкаливает. |
У нас свободный форум... Но с тобой точно не стоит вообще иметь дело. :D
|
Цитата:
Цитата:
Цитата:
|
fxobject,
для справки. 1) longQuery(params, (response) => { ... }) Запрос "куда-то туда". В базу данных, на другой сервер, в файловую систему, пересылка данных по сети... Здесь на отрезке времени от вызова longQuery и до срабатывания колбэка (функции, в которую будет передан response) Node не блокируется, не простаивает. Она вообще забывает про отправленный запрос и занимается своими делами - обработкой других запросов. Потому longQuery безболезненно запускается в основном потоке. 2) const response = bigCalculationWithLongCycle(params); это синхронные вычисления. Они заблокируют ноду. Поэтому вот их надо в отдельном воркере. Воркер отработает параллельно и закинет результат в основной поток. Над этой штукой можно легко сделать обертку, подобную п.1, с философией "запрос в другой поток за результатом вычислений", ну ты понял. А ещё правильнее всё потом промисифицировать для пущего удобства. Если у тебя вперемешку и то и другое, то декомпозируй на функции-запросы и функции-вычисления, после чего пп. 1 и 2. |
Часовой пояс GMT +3, время: 10:00. |