bro-dev
@bro-dev

Тяжелые вычисления на ноде, как распределить во времени?

Поднят сервер с express, в том же скрипте отдельно есть вычисления которые длится секунд 20, так вот проблема в том что во время их сервер полностью перестает реагировать. Проблема точно не понимании асинхронности, не отвечает любой роут.
Задача не сложная получает подписчиков с 2х групп вк и вычитает, если группы по 200000 то уже секунд 20 думает, хотя казалось бы не сложная задача алгоритм простой 2 вложенных фора. Во время получения подписчиков тоже долгий процесс, но все норм работает, то есть загружена не сеть.
вот алгоритм мб в нем проблема и можно сделать оптимальнее
spoiler
//user_ids массив первой группы 200к идшников и так же banIds вторая группа
var tar = [];
        for (let i = 0; i < grdb.user_ids.length; i++) {
            var exist = false;
            for (banId of banIds) {
                if (banId == grdb.user_ids[i]) {
                    exist = true;
                    break;
                }
            }
            if (!exist) tar.push(grdb.user_ids[i]);
        }
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 2
k12th
@k12th
console.log(`You're pulling my leg, right?`);
O(n*n) -- это как раз таки не простой алгоритм...
По делу: вынесите этот тяжелый цикл в отдельный процесс с помощью cluster или тупо child_process. Или напишите аддон на C++ или Rust.
Ответ написан
megafax
@megafax
web-программист
Вынесите эту обработку в отдельный процесс/скрипт, который будет слушать tcp/http входящие соединения и обрабатывать приходящие в него данные (Ваш цикл собственно) и с ним уже общайтесь из основного приложения. Суть в том, что Ваш event loop не прерывается на этом цикле и пока не закончит работать - не отдаст управление. Т.е. надо искусственно вызвать прервыание этого цикла. Можно его завернуть в промисы + setTimout(..., 0) но это явный костыль.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы