Танцы с бубном
Jan. 21st, 2017 02:57 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Попробуйте с помощью async исполнить параллельно 5000 задач. Можно даже не пробовать – получится плохо.
Зал подсказывает: надо использовать parallelLimit. А вот хуй. Все равно подавится. Потому что из каждой задачи будет вызываться callback, а из него следующая задача, и снова коллбэк… У вас получится 100500 вложенных вызовов и нода умрет где-то в районе 1300ого. Проверено экспериментально.
Но есть одна штука с винтом. Надо вызов коллбэка обернуть вот так:
process.nextTick (function () { callback(null); }); Тогда коллбэк будет вызван действительно асинхронно, в следующем цикле обработчика событий
Вытянул 100.000 пользователей ЖЖ из общего рейтинга и плотоядно облизнулся.
Update 1: ан нет, не вытянул. Таки подавился на где-то на середине. Память кончилась. Надо разбираться как нода управляется с памятью
Update 2: я нашел эту подлую тварь, которая жрала память как не в себя. Я охуел когда выяснил причину. И охуел еще раз, от того как ее удалось решить
Было: users.push($(item).text());
Стало: users.push(($(item).text()+' ').trim());
метод text() в cheerio.js должен возвращать строку. А он возвращает ссылку на то место где эта строка лежит. И таким образом ссылается на весь DOM. И естественно, что сборщик мусора не удаляет весь этот ненужный кусок говна пока в users будет ссылка на это говно, а она будет до самого конца, пока не распарсятся все 5000 страниц. И DOM для всех этих страниц будет храниться до конца, хотя оттуда нужно лишь 20 коротких строчек на страницу.
Попробовал явно преобразовать это говно в отдельную строку. Через new String(говно), _.clone(говно), говно.substr(0) и даже говно+’’. Не помогло. В последних 2ух случаях слишком умный движок V8 решил, что он лучше знает что я хочу и, блядь, соптимизировал. Оставил говно говном. Ну типа ж ничего не изменилось, верно? Со ссылкой на всю навозную кучу.
Я в полном ахуе. Но я таки вытянул 100.000 пользователей ЖЖ из общего рейтинга ;)
P.S О таком не пишут в мануалах и на показывают на модных курсах.