Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В случае, если запросы приходят редко, как в первом рассмотренном примере, вреда от process.nextTick() не будет совсем.
У вас на первых картинках есть read(1) и read(2)… Я так понял это для случая когда для calc(1,2) нужны 2 файла? Просто на следующих картинках уже остается только один единственный read()Да, всё верно. Имхо, это не суть важно, если суть понятна. В первом примере две операции чтения, необходимые для «расчётов», а далее изображена только одна. Я думал думал нарисовать пример с чтением двух файлов, независимо обработкой и последующей синхронизацией, но по остановился на приведённых примерах.
Что такое libeio Thread? Разве файлы читаются в потоке ОС? Вроде для файлов есть уже асинхронное АПИ на уровне ОС… Хотя это не сильно на суть влияет.Да, в потоке OC. Во-первых, для переносимости. Во-вторых, судя по обсуждению в рассылке nodejs, в ядре 2.6 (или в glibc такого-же возраста) асинхронные операции также поддерживаются этим способом. Так что в libeio асинхронность реализована своими силами.
Было бы совсем круто если на каждом графике была бы подпись типа «readAsync()+nextTick()», «readAsync()», «readSync()» а то сейчас там где 2 графика склеено особенно долго вдумываться приходится.Спасибо, стараюсь сделать хорошие иллюстрации, так что добавлю заголовки на них.
Ну а по сути, в любом случае, вся производительность зависит от длины calc() отрезка, соответственно самый лучший способ ускорить NodeJS — сокращать этот отрезок как таковой для каждого запроса. Разбивать его на более мелкие — это работает до некоторого предела, пока у вас весь уровень EventLoop v8 не забьется calc() отрезками. А тогда уже нужно будет запускать воркеров и привет старый добрый апач…От этого никуда не удастся уйти. Никакой язык не позволит сделать то, что может лишний сервер :) Надеюсь это все понимают.
Так что в libeio асинхронность реализована своими силами.
Никакой язык не позволит сделать то, что может лишний серверНу тут просто можно упереться в одно ядро процессора а не в один сервер.
Асинхронность файлового чтения или (OMG) сетевого сокета тоже? Надеюсь только первое…Только первое, вторым заведует libev со стандартным набором select/poll/epoll/kqueue на выбор внутри.
Прозрачного распределения по процессорам/ядрам у NodeJS, насколько я знаю, нет — просто запускают несколько «воркеров» и балансировщик нагрузки перед ними… Но тогда схема с NextTick еще менее ясной становится — если приходит новый клиент когда процесс Node занят calc-ом, то обработка будет поручена соседнему воркеру и необходимость в усложнении кода разбиением на nextTick отпадает.Для этого как раз и сделан последний пример, из которого видно что польза от nextTick может быть, как раз таки за счёт плотного расположения. Ибо вне зависимости от количества воркеров это позволяет немного ускорить каждый из них в определённых ситуациях.
Наглядно о потоке выполнения в Node.js