Как стать автором
Обновить

Комментарии 6

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

Существует среда выполнения кода, чаще всего это V8. Именно среда выполнения может реализовывать разделение задач на разные потоки (например, разные вкладки), но это не относится к самому JavaScript как языку. Если вы хотите реализовать многопоточность, то можете обратиться к веб-воркерам.

Было бы интересней если бы вы рассказали про современные реализации многопоточности, а не пересказывали чужой труд или документацию по EventLoop

Один понятный ад заменили на другой, непонятный 🙂...

Как в последнем примере функции запустились одновременно? Если первая функция закинулась в калл стэк, выполнилась(обратилась к апи браузера для создания таймера), вышла из стэка, и закинулась другая.

Тут есть прям красота:

Кроме того, при параллельных запросах к одним и тем же данным нередко возникает «состояние гонки» (race condition), когда несколько задач пытаются одновременно изменить одни и те же данные, а результат зависит от того, какая задача завершится первой.

Автор сначала приводит формулировки параллельных, одновременно, а потом в след абзаце пишет про очередность.

Или еще красота:

В асинхронном JavaScript это связано с тем, что задачи выполняются параллельно в очереди задач, но движок JavaScript обрабатывает их последовательно.

Как это, «параллельно в очереди» 😂

Спасибо за замечание! Формулировки действительно могли показаться противоречивыми. В случае «состояния гонки» (race condition) речь идёт не о буквальном одновременном выполнении задач, а о возможных конфликтах при доступе к одним и тем же данным, когда завершение задач зависит от их порядка. Это важно учитывать в асинхронных системах. Что касается «параллельно в очереди задач», то речь идёт о том, что задачи могут быть инициированы одновременно, но их выполнение в движке JavaScript происходит строго последовательно в рамках одного потока. Условная параллельность здесь описывает именно одновременное нахождение задач в очереди, а не их реальное параллельное выполнение.

Спасибо за вопрос! В статье в целом параллельность идёт условная. Первая функция выполняется, создаёт таймер через API браузера и выходит из стека вызовов, освобождая место для следующей задачи. Тем временем таймер попадает в очередь задач. Когда основной поток освобождается, задачи из этой очереди начинают выполняться. В результате создаётся впечатление одновременного выполнения, хотя на самом деле задачи запускаются последовательно, но их завершение может пересекаться. Это связано с особенностями работы цикла событий.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий