LINUX.ORG.RU

Правильно ли модель nodejs называть «асинхронной»?

 , , ,


0

1

Когда то читал умные книжки, и насколько я понял, в CS асинхронностью называют реально одновременное выполнение различных программных объектов. Если мы имеем имитацию одновременности путем разделения процессорного времени, это уже не асинхронность. По другому это называется конкурентность.

Однопоточность исключает одновременное выполнение, тогда какая же это асинхронность?

То есть, понятно, что часть операций под ковром, в основном IO, действительно выполняются одновременно с потоком выполнения nodejs, но это, как бы, к модели самой nodejs не имеет отношения.

Короче, наверное, nodejs не асинхронна, тут имеет место ошибка терминологии, как вы считаете?

присоединюсь к вопросу и спрошу: в node.js ведь файловый ввод-вывод реализуется посредством posix aio?

xperious ★★ ()

Во-первых, «реально одновременное выполнение» - это параллельность.

Во-вторых, в ноде в одном потоке исполняется только пользовательский код. Ввод-вывод выполняет в других потоках, и параллельно основному, если это возможно.

anonymous ()

Нет, асинхронность и параллельное выполнение — разные вещи.

x3al ★★★★★ ()
Ответ на: комментарий от anonymous

Нода кроссплатформена

ну это ясное дело... я имел ввиду на линуксе то как

xperious ★★ ()
Ответ на: комментарий от anonymous

Во-первых, «реально одновременное выполнение» - это параллельность.

Ну, если следовать определению из википедии, это более широкое понятие:

Параллельные программы могут физически исполняться либо последовательно на единственном процессоре — перемежая по очереди шаги выполнения каждого вычислительного процесса, либо параллельно — выделяя каждому вычислительному процессу один или несколько процессоров (находящихся рядом или распределённых в компьютерную сеть).

Насколько я понимаю, асинхронность — это как раз такой вид параллельности, который реализует реальную одновременность, не?

asyncron2018 ()
Ответ на: комментарий от x3al

Нет, асинхронность и параллельное выполнение — разные вещи.

Разные, но одно подвид другого

Как раз параллельность не предусматривает обязательной одновременности

Правильно ли модель nodejs называть «асинхронной»? (комментарий)

Весь код, который выполняется непосредственно движком JS синхронен, тогда почему мы должны называть это «асинхронностью»?

IO не блокирует поток, но он и не исполняется в JS

asyncron2018 ()
Ответ на: комментарий от asyncron2018

это более широкое понятие
перемежая по очереди шаги выполнения каждого

Это обусловлено физическими ограничениями. В сущности и при наличии нескольких ядер\процессоров, твои потоки на самом деле не обязательно выполняются параллельно, потому что в системе намного больше потоков в момент времени, чем доступных ядер, и твоя программа не единственная.

ты же писал про реальное одновременное.

anonymous ()
Ответ на: комментарий от anonymous

Это обусловлено физическими ограничениями. В сущности и при наличии нескольких ядер\процессоров, твои потоки на самом деле не обязательно выполняются параллельно, потому что в системе намного больше потоков в момент времени, чем доступных ядер, и твоя программа не единственная.

Это передергивание понятий:) Если так рассуждать, то на нескольких ядрах вообще все параллельно и асинхронно

asyncron2018 ()
Ответ на: комментарий от asyncron2018

Асинхронность — это свойство абстракции, на которой пишут софт, а не непосредственно движка JS.

https://en.wikipedia.org/wiki/Asynchrony_(computer_programming)

Иначе мы договоримся до того, что однопроцессные одноядерные системы не могут быть асинхронными в принципе (при том, что скажем, асинхронность GUI известна с... примерно момента появления GUI)

x3al ★★★★★ ()
Ответ на: комментарий от x3al

Я как раз и говорю об этом как об абстракции. И именно в этом смысле, независимом от реализации, строго последовательно выполняемый код неправомерно называть «асинхронным». В каком смысле тогда он «асинхронный»?

asyncron2018 ()
Ответ на: комментарий от asyncron2018

Нет, ты говоришь об

в CS асинхронностью называют реально одновременное выполнение различных программных объектов

а это определение — неверно.

x3al ★★★★★ ()
Ответ на: комментарий от x3al

Он не «асинхронен» даже в том смысле, что он не может прерываться сигналами «из внешнего мира». То есть, он даже не имеет свойства полноценной интерактивности, событийно-ориентированности То есть, синхронен более чем полностью.

asyncron2018 ()
Ответ на: комментарий от asyncron2018

Но в каком тогда смысле он «асинхронен»

В таком же, в каком императивен.

anonymous ()
Ответ на: комментарий от anonymous

Кстати, в декларативной модели вообще никакой асинхронности быть не может, потому что там понятие времени отсутствует

asyncron2018 ()
Ответ на: комментарий от tailgunner

Раньше у него вбросы были поинтереснее... ээх, Энтропия, энтропия :-)

Twissel ★★★★★ ()
Ответ на: комментарий от x3al

Короче говоря, вопрос сводится к тому, что можем ли мы называть строго последовательное выполнение «асинхронным» в каком бы то ни было смысле этого слова. Просто ни одно мыслимое определение асинхронности в такую модель не засунешь

asyncron2018 ()
Ответ на: комментарий от x3al

Худо-бедно, его конечно, можно назвать неблокирующим, в том смысле, что блокирования исполнения при вводе-выводе не происходит, он не «ждет» ответа на свой запрос, прежде чем исполнять последующий код. Но неблокирующий ведь != «асинхронный», как ты считаешь?

asyncron2018 ()
Ответ на: комментарий от asyncron2018

можем ли мы называть строго последовательное выполнение

Где ты нашел в ноде «строго последовательное выполнение».

anonymous ()
Ответ на: комментарий от anonymous

А где там не строго последовательное исполнение? Приведи пример

asyncron2018 ()
Ответ на: комментарий от asyncron2018

Везде. Весь эвент-луп - это не строго последовательное выполнение.

anonymous ()
Ответ на: комментарий от asyncron2018

Приведи пример

process.env.UV_THREADPOOL_SIZE = 32

var start = process.hrtime();

for (var i = 0; i < 100; ++i) {
    (function (id) {
        fs.readdir('.', function () {
            var end = process.hrtime(start);
            console.log(util.format('readdir %d finished in %ds', id, end[0] + end[1] / 1e9));
        });
    })(i);
}
readdir 2 finished in 1.649030852s
readdir 0 finished in 1.649261181s
readdir 1 finished in 1.649458002s
readdir 3 finished in 1.6496436540000001s
readdir 4 finished in 1.649830815s
readdir 5 finished in 1.650015259s
readdir 6 finished in 1.650193968s
readdir 7 finished in 1.650365734s
readdir 8 finished in 1.650536896s
readdir 9 finished in 1.6507071519999998s
readdir 10 finished in 1.650877408s
readdir 12 finished in 1.6510479660000001s
readdir 11 finished in 1.6512182229999999s
...
readdir 86 finished in 1.663928579s
readdir 87 finished in 1.664094307s
readdir 89 finished in 1.664260941s
readdir 88 finished in 1.664432405s
readdir 90 finished in 1.664605076s
readdir 91 finished in 1.6647702s
readdir 92 finished in 1.664937136s
readdir 93 finished in 1.665102562s
readdir 94 finished in 1.6652682909999998s
readdir 95 finished in 1.6654358299999998s
readdir 96 finished in 1.665603671s
readdir 97 finished in 1.665770003s
readdir 98 finished in 1.66593392s
readdir 99 finished in 1.6661014600000001s
anonymous ()
Ответ на: комментарий от anonymous

Это заблуждение. Весь код исполняется строго последовательно.

Вот, допустим, код, который часто называют «асинхронным»:

onResponse(responseListenerHandler)
write(foo)
Ты тут посадил код на событие ответа. Но ничего «непоследовательного» тут нет. Ты сначала сконфигурировал объект, затем написал foo. если событие ответа произойдет во время исполнения кода, обработчик будет ждать текущее исполнение, и выполнится лишь в порядке своей очереди.

Строго последовательный код

asyncron2018 ()
Ответ на: комментарий от anonymous

Этот пример ничего не доказывает. Тут разница обусловлена разным временем чтения. Тут «асинхронность» внешняя, в отношении исполнения JS

asyncron2018 ()
Ответ на: комментарий от asyncron2018

Тут «асинхронность» внешняя, в отношении исполнения JS

Асинхронность - это жонглёр.

Вся суть асинхронности в работе с задачами, которые не требуют вычислительной мощности, но требуют неопределенного времени исполнения. Чтение с диска, запрос по сети, реакция пользователя...

surefire ★★★ ()

NodeJS асинхронно. По сути - весь асинхронный код запускается последовательной (почти) и выполняется в легких потоках. Хотя реальный железный поток один. Пока не заюзали какой нибудь cluster. Скорее проблемы не ноды, а у вас. Полное незнание и не понимание как устройства ВМ nodejs, так и в целом понятия асинхронного исполнения.

silver-bullet-bfg ★★ ()
Ответ на: комментарий от surefire

Для этих задач достаточно и того, чтобы реализация не блокировала исполнение на время между запросом и ответом. Правомерно ли это называть «асинхронностью»?

asyncron2018 ()
Ответ на: комментарий от asyncron2018

не блокировала исполнение на время между запросом и ответом. Правомерно ли это называть «асинхронностью»?

По сути да, не блокирующий код и есть асинхронный.

surefire ★★★ ()
Ответ на: комментарий от surefire

Ну, если это так трактовать, то нода конечно, «асинхронная», но термин крайне неудачно подобран, он вводит пользователя в заблуждение, потому что реально тут никакой асинхронности нет, есть лишь отсутствие блокирования ожидания со стороны реализации.

asyncron2018 ()
Ответ на: комментарий от silver-bullet-bfg

железный поток один

нет он не один. открой top да посмотри.

anonymous ()
Ответ на: комментарий от asyncron2018

лишь отсутствие блокирования ожидания со стороны реализации.

Если бы было блокирование, то можно было бы одновременно отправить только один запрос в сеть, ожидать нажатие только 1 кнопки в UI. А жонглер подкидывал бы только один шарик за раз. А так жонглер подкидывает сразу 10 шариков не смотря на то, что у него всего 2 руки.

surefire ★★★ ()
Ответ на: комментарий от silver-bullet-bfg

и выполняется в легких потоках.

Под «легкими потоками» принято понимать переключение управления в рамках одного потока. Ничего подобного там нет. Если бы там были легкие потоки, вы смогли бы сделать что-то вроде такого

run1 = function(){write(1); write(2)}
run2 = function(){write(1); write(2)}

run1()
run2()

>>>1
>>>1
>>>2
>>>2

Это можно реализовать отдельно, но этого нет в самой ноде

asyncron2018 ()
Ответ на: комментарий от asyncron2018

Просто не нужно смешивать JS и event loop роль которого исполняет libuv.

surefire ★★★ ()

В ноде асинхронный ввод-вывод, под них каждый раз выделяется новый поток libuv, код пользователя не асинхронно выполняется, если он не затрагивает ввод-вывод.

menangen ★★★★★ ()

Термин «асинхронный» в контексте данного обсуждения относится скорее к стилю программирования, а не к выполнению. Асинхронный стиль программирования подразумевает использование неблокирующих операций там, где это возможно, что позволяет на полную катушку использовать имеющиеся процессорные ресурсы. Типичный пример — это грамотное использование epoll при работе с сокетами в Linux.

Современные операционные системы в своих API-шках предоставляют возможность программировать в таком стиле, а использовать асинхронность или нет, решает или сам программист, или за него - разработчики соответствующего движка или фрэймворка (тогда использование асинхронных api-вызовов зашивается непосредственно в движок).

P.S. Надо учитывать, что одно и то же слово в разных контекстах может иметь совершенно разный смысл :) Подмена контекста - это, кстати, один из типичных приемов манипуляции сознанием людей.

vinvlad ()
Ответ на: комментарий от vinvlad

P.S. Надо учитывать, что одно и то же слово в разных контекстах может иметь совершенно разный смысл :) Подмена контекста - это, кстати, один из типичных приемов манипуляции сознанием людей.

Тут скорей подмена самого понятия. Неблокирующие операции называют «асинхронными»

asyncron2018 ()
Ответ на: комментарий от asyncron2018

Тут скорей подмена самого понятия. Неблокирующие операции называют «асинхронными»

Слово «асинхронный», как правило, норовят использовать там, где есть какие-то callback-функции или обработчики событий/сигналов. Подразумевается, что выполнение основного потока может быть прервано в какой-то произвольный момент и управление может быть передано такой «асинхронной» функции, после чего возобновляется выполнение прерванного потока.

Классический пример - функции-обработчики POSIX-сигналов. Это пример именно «асинхронного выполнения».

vinvlad ()

Асинхронность это навешивание колбека вместо блокирования потока. Развели тут масло масляное

redixin ★★★★ ()

А забанте его заранее, пока он тут ещё больше шизы не разлил.

anonymous ()
Ответ на: комментарий от vinvlad

Подразумевается, что выполнение основного потока может быть прервано в какой-то произвольный момент и управление может быть передано такой «асинхронной» функции, после чего возобновляется выполнение прерванного потока.

Для nodejs и это несправедливо

asyncron2018 ()
Ответ на: комментарий от asyncron2018

... Для nodejs и это несправедливо

А я разве утверждал, что это справедливо для nodejs? ) - я просто привел пример понятия (термина) «асинхронное выполнение" (в контексте одного потока), чтобы было ясно, что нельзя придираться к слово «асинхронный» выдирая его из какого-то общепринятого термина, в котором это слово присутствует.

Есть более-менее общепринятые понятия-термины, типа: «асинхронный стиль программирования», «асинхронный фрэймворк», «асинхронное выполнение функции», «асинхронная callback-функция» и т.п.

Эти понятия имеют вполне конкретное определение (смысл, семантику) и их нельзя делить на отдельные слова и потом придираться к этим отдельным словам на том основании, что они присутствуют в других понятиях с другим смыслом. Только и всего.

Почему Nodejs называют асинхронным? Ну просто еще до Nodejs появились библиотечки и фрэймворки, ориентированные на использование неблокирующих операций. В названии и описании неблокирующих операций (в документации) частенько присутствует «async», «asynchronous» - отсюда это словечко и перекочевало в названия соответствующих библиотечек-фрэймворков.

ПРИМЕР:

The WSAAsyncGetHostByName function asynchronously retrieves host information that corresponds to a host name

The WSAAsyncSelect function requests Windows message-based notification of network events for a socket.

vinvlad ()
Ответ на: комментарий от Twissel

Некоторые получают удовольствие от демонстрации своих гениталий напуганным бабам, а кто-то создавая псеводинтеллектуальные темы на ЛОРе под видом «computer science».

Сколько его лечили на этот раз? Может передоз и он превращается в овощ? Мельчает пациент, но как человека мне его жаль.

I-Love-Microsoft ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.