@LokerdLife1

Как организовать бесконечный цикл (или бесконечную рекурсию) в Node.JS без утечки памяти?

Добрый день!
Стоит задача разработать программу на JavaScript (принципиально) с неограниченным циклом работы средствами Node.JS. Встала проблема, что программа подъедает память. Самым оптимальным решением стал следующий код:
loop();
function loop() {
    //Тут произвольный код
    setTimeout(function() {
        loop();
    }, 8);
}

Но и тут происходит утечка (по 0.5 - 1mb в час) что крайне критично. Решение с бесконечным циклом не подошло тем, что крайне сложно организовать задержку между итерациями без утечки.
В PHP вопрос решается просто (если не забывать чистить переменные в теле цикла и периодически запускать принудительную чистку):
for(;;){
    //Тут произвольный код
    usleep(8000);
}

В первый раз столкнулся с проблемой утечки памяти в JS и с лету решить проблему не получилось. Вероятно кто-то сталкивался с подобным?
Спасибо!
  • Вопрос задан
  • 1352 просмотра
Решения вопроса 1
@LokerdLife1 Автор вопроса
Решение Lynn «Кофеман» (смотри комментарии под вопросом) помогло оптимизировать программу! Первые 2-3 часа ситуация была хуже, чем с моим решением (предполагаю по тому, что код стал проще и количество итераций за единицу времени увеличилось, тем самым скорость поедания памяти тоже увеличилась), но по непонятным мне причинам через 6-8 часов память стала возвращаться системе, да еще и в каком объеме (потребляемая память сократилась с 6.6mb до 3.4mb). Что произошло - не понятно. Скрипт работает в штатном режиме. Да, все еще подъедает память, но спустя несколько часов резко отдает половину системе. Есть над чем поразмышлять.

Для заинтересовавшихся - ОС: Ubuntu 18.04.1; платформа - Node.JS 8.10; код программы:
loop();
function loop() {
    setTimeout(loop, 8);
}


Не уверен что проблема не вернется, т.к. не до конца понимаю природу всех процессов. Если кто-то сталкивался с подобным или понимает, что тут происходит (хех), буду рад услышать ваше мнение!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ruddy22
@ruddy22
Спасение утопающих — дело рук самих утопающих
Бесконечный цикл в JS:
while (true) {
  // do something here
}


Если говорить о задержках, то никто не мешает организовать работу через (микро-)очереди и резолвить резултат через Async/Await.

НО!
По версии air-bnb, резолвить async/await в циклах while, forloop - плохая практика. Вот ссылка.

PS
Утечки будут, от них не скрыться! Вопросы к архитектуре платформы (NodeJS/Browser => V8) и коллектору мусора.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 15:01
35000 руб./за проект
19 апр. 2024, в 14:12
30000 руб./за проект