Pull to refresh

Comments 38

Всегда думал что асинхронный вызов создает что-то типа потока внутри общего контейнера (который снаружи выглядит как один процесс). Как в единую очередь вызовов попадают асинхронные вызовы? Просто подмешиваются по мере исполнения? А если окружение реализует всю асинхронную кухню, то почему это не вид многопоточности?

Это неуправляемая многопоточность. Ей не дают управлять, чтобы не выстрелить себе в ногу. Тут нужно различать, многопоточность и асинхронность.

Я понимаю различия многопоточности и асинхронности. Но если я через асинхронные вызовы могу создавать и удалять некие условные "потоки", значит эта "условная многопоточность" все-таки не совсем неуправляемая? Конечно это не горутины, но… Так в итоге, как именно обрабатываются "окружением" асинхронные вызовы? Конкурентно? Зависит от движка?

Управлять конечно можно. В некотором смысле. Но суть от этого не меняется. Программист на javascript не может полноценно управлять потоками. Он может предполагать, что где-то кто-то создаст за него поток или 5 потоков или 10. Он не знает сколько. Весь код, который пишет программист на JS выполнится в одном потоке (если не принимать во внимание веб-воркеры).

Мне навскидку приходит несколько вариантов реализации управления потоками (отдельными контекстами исполнения, созданными через асинхронные вызовы). По управлением я понимаю, как минимум, создание/удаление, блокировку, обмен данными. Помимо этого, существуют уже реализованные библиотеки и тулзы для "чего-то типа" мультитридинга в JS. Кроме того, не вижу причин не принимать во внимание веб-воркеры. Во многом ответ на вопрос о многопоточности в JS лежит именно в тонкостях реализации того, что вы назвали окружением. Но вы старательно избегаете этой темы, хотя изначально взялись объяснить ("зависит от реализации" — это, извините, не ответ). Надеюсь на следующую статью.

Рискну предположить, что окружение само решает как обрабатывать вызовы. То есть ответ на ваш вопрос: зависит от реализации.
Согласен с вами,
имхо устоявшийся термин js асинхронность — это и есть многопоточность. Многопоточность, разделяющая процессорное время (в данном случае — очередь вызовов).
Кто помнит *nix-подобные системы и Windows 9x как раз и стали теми ОС (надеюсь никого не забыл?), кто привнесли многозадачность на единственном процессоре за счёт разделения процессорного времени. И именно в такой ситуации и зародилась «классическая» многопоточность.

Единственной отличие js — не вижу никакого способа внешнего управления потоками (проритет, возможность остановки, ...)
Но можно написать внутренний планировщик, переопределить setTimeout\interval\requestAnimationFrame, HTMLElement.prototype.addEventListener и всякие xhr эвенты. Соответственно в этих функциях заворачивать исходную функцию в функцию и отдавать непереопределённой функции. И вот тогда можно начинать управлять порядком исполнения коллбэков и навертеть любую другую логику. Если бы было можно переопределить у всех объектов valueOf (в том числе у Number) и toString, то стало бы возможно использовать такие вызовы вместо прерываний и устроить параллельное выполнение разных функций. Это бы убило всю производительность, но я бы определённо написал библиотеку реализующую это и вылил в openSource с предупреждением о возможном вреде производительности и мозгу при попытках понять происходящее.

Отлично, как раз хотелось больше инфы про неё.

Ребят, это детский сад, а не пособие для тех кто хочет разобраться. Это супер базовое введение коих сотни. Хорошее пособие для тех кто хочет разобраться это например рассказать о внутреннем устройстве промисов, асинков, авайтов, генераторов. Рассказать как работает yield, как это на самом деле внутри работает, какие плюсы и минусы по перфомансу.
Да. Это базовые знания. Но многие про это не знают. Это видно по собеседованиям. В любом случае, спасибо за обратную связь. Постараемся в следующий раз написать про что-то более хардкорное.
Пишите что-то новое.
Я может резковато высказался, вполне возможно просто несовпадение ожиданий вызванных заголовком и тела статьи. Иначе говоря слишком общий и громкий заголовок. В вообще, хорошо написано, продолжайте.
Асинхронность в JavaScript: Пособие для тех, кто хочет запутаться разобраться
Все циклы от большого числа до нуля, можно было написать как while (i--); Во втором примере
Спасибо, как-то не подумал об этом ))
Либо я трудный, либо картинка-схема(
В действительности, к даже таким базовым вещам – разработчик приходит спустя пару лет опыта. Когда начинает оптмизировать свои велосипеды.
За отличные иллюстрации отдельный +
> Асинхронные операции выполняются не в движке, а в окружении (5,6). Окружение — надстройка на движком. NodeJS и Chrome для движка V8 и Firefox для Gecko. Иногда окружение еще называют web API.

ШТА?
Дорогой автор, вся «асинхронность», т.е. порядок выполнения job-ов, описаны непосредственно в стандарте ECMAScript
http://www.ecma-international.org/ecma-262/6.0/index.html#sec-executable-code-and-execution-contexts
Почитайте на досуге. Например, промисы принципиально по стандарту работают асинхронно.

WebAPI — это просто все API, определённые в браузере, а не в стандарте ECMA.
Все так, но я сходу не могу придумать как запустить что-то асинхронно на чистом v8. Если вы подскажите, будет очень круто, я обязательно добавлю это в статью.
Promise.resolve().then(() => console.log('async'))
Исправил статью. Спасибо за уточнение.

Ну какая же это асинхронность, это всего лишь отложенный вызов функции, который достигается перекладыванием на верх ивэнт лупа. Так же как и nextTick. Есть ещё setImmediate, который кладёт вызов функции вниз ивэнт лупа. Поэтому манипуляции с ивэнт лупом можно назвать "отложенностью", но никак не "асинхронностью".

Во-первых, nextTick и setImmediate определены в Nodejs и в браузере соответственно, а не в стандарте ECMAScript
Во-вторых, а дайте определение «асинхронности» и «отложенности», пожалуйста.

Мой комментарий был лишь к тому, что бы читатель понимал из-за чего достигается подобное поведение. И я например не считаю, что это можно назвать асинхронностью, но и в дискуссию также не хочу вступать, если считаете иначе, то пускай так и будет. Это всего лишь мое мнение. Но изменение очереди вызова функций, лично мне, сложно назвать асинхронностью. Ведь в конце концов, вызов функций остаётся синхронным, лишь порядок изменяется. То есть здесь нет никого, кто бы выполнял какой либо таск вне потока ивэнт лупа. Но и вы тоже отчасти будете правы если скажете, что функция не синхронная, так как в данном случае мы не можем использовать, например return x, так как функция возвращает свой результат в коллбэке, который в свою очередь будет вызван хоть и синхронно, но после актуального вызова.

К чему словоблудие — просто поясните, что такое, по-вашему, асинхронность.
Умеющий читать — да прочтёт:
… здесь нет никого, кто бы выполнял какой либо таск вне потока ивэнт лупа..
UFO just landed and posted this here
UFO just landed and posted this here
console в v8 нет. А в общем и целом вы правы. Можно в движке запускать что-то асинхронно.

   Promise.resolve().then(function(){print(1)});
   print(2);

На выходе:
2
1

Другое дело, что смыла в этом особого нет, кроме тех случаев, когда нужно решить проблему с сильной загруженностью стека вызовов.
как уже было отмечено, технически вызовы не совсем асинхронны. Правильнее наверно говорить о паралельном (фоновом) выполнении. Речь именно о ожидании ответа а не просто запуске некоего паралельного обработчика
Аналогичная ситуация с await async в .NET.
Асинхронность — это когда функция возвращает управление.а вызываемая сторона потом по своей инициативе дергает некий callback или типа того.
Реальная асинхронка, например, медицинский стандарт DICOM где и SCU и SCP вставляют TCP порты. И когда SCU делает запрос на передачу файла, SCP говорит — команду понял, закрывает соединение, ищет файл. потом открывает свое соединение по TCP и начинает передавать.
мы платим огромным числом обратных вызовов, блокированием основного потока и постоянными потерями контекста

а еще запутаный, нечитаемый и неотлаживаемый код — фиг его знает кто в каком месте повесил какой евент или биндинг.
По своей шкуре знаю как жертва проекта на Flex

Понадобилось время, чтобы понять, что пункта 4 нет на рисунке
Sign up to leave a comment.