Подтвердить что ты не робот

Как связать цепочку событий, очередь обратного вызова и Javascripts с одним потоком?

ОБЩАЯ ЦЕЛЬ

Мне нравится знать, как следующие фрагменты среды javascript соединяются как система.

  • Javascript Engine
  • Цикл событий
  • Очередь событий

Мы можем ограничить это средой браузера, поскольку node рассмотрен в другой статье (здесь)

ВЕЩИ Я (верю) ПОНИМАЮ:

  • Javascript однопоточный и поэтому имеет только один столбец.

  • В средах Javascript предусмотрены только несколько функций, которые действительно асинхронны. Они могут включать в себя функции setTimeout(), setInterval() и функции ввода/вывода.

  • Разработчик не может создавать свои собственные асинхронные функции, не используя один из них.
  • Сам Javascript работает синхронно, но через его асинхронные функции можно вызвать функции блокировки после того, как текущий столбец будет очищен.

Пример:

      console.log(‘Sync code started…’);

      setTimeout(function asyncLog() {
           console.log(‘Async function has completed’)
      }, 2000);

      console.log(‘Sync code finished…')

ПРИМЕР ШАГИ:

(Пожалуйста, исправьте шаги, если Im неправильно)

  • "Начат запуск кода синхронизации..."
  • setTimeout добавляется в стек, но сразу возвращается управление
  • setTimeout отправляется другому "потоку... работнику"? вне javascripts одного потока для подсчета 2000 миллисекунд
  • "Завершено завершение кода синхронизации..."
  • После 2000 миллисекунд asyncLog() помещается в очередь событий
  • Поскольку столбец очищен, Event Loop проверяет очередь событий для ожидающих обратных вызовов
  • asyncLog() удаляется из очереди и помещается в стек с помощью цикла событий
  • 'Завершено выполнение функции Async
  • callstack теперь прозрачен

ВОПРОСЫ

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

  • На шаге 3, кто создает этот новый поток? Это браузер?
    • Этот новый поток заблокирован правильно?
    • Что произойдет, если у вас есть цикл, который создает 1000 setTimeouts. Созданы ли потоки 1000 '?
    • Есть ли ограничение на количество потоков, которые могут появляться за раз?
    • Когда новый поток заканчивается, как он заканчивается в очереди?
  • Кто поставляет очередь событий?
  • Кто поставляет Event Loop?
    • Проводит ли цикл событий очередь событий?
    • Является ли поток javascripts осведомленным о цикле событий? Или цикл событий просто вставляет вещи в стек?
    • Как цикл цикла знает, когда стек ясен?
4b9b3361

Ответ 1

Ваше понимание и ваш пример кажутся в основном правильными. Теперь на ваши вопросы:

На шаге 3, кто создает эту новую тему? Это браузер?

Да. Это в основном то, что обеспечивает реализацию для этих "действительно асинхронных" функций. IIRC, setTimeout реализован непосредственно в движках JS, в то время как сетевой ввод-вывод определенно будет обязанностью браузера - но на самом деле не имеет значения, кто их создает. В конце концов, в вашей "браузерной среде" это всегда какая-то часть браузера.

Эта новая тема заблокирована правильно?

Да. Нет. Это зависит от работы, которая должна быть выполнена, то есть от того, какую асинхронную функцию вы вызвали. Некоторым может потребоваться вращение нового потока, но для простых тайм-аутов я почти уверен, что используется неблокирующий системный вызов.

Что произойдет, если у вас есть цикл, который создает 1000 setTimeouts. 1000 темы созданы?

Возможно. Хотя вряд ли. Я бы предположил, что для тех асинхронных действий, которые действительно требуют своего собственного потока, используется пул потоков, а запросы помещаются в очередь. Размер этого пула может быть скрыт в недрах конфигурации вашего браузера.

Существует ли ограничение на количество потоков, которые могут быть созданы одновременно?

Это будет контролироваться ОС.

Когда новый поток завершает работу, как он попадает в очередь? Кто поставляет Очередь Событий?

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

Кто поставляет Event Loop? Цикл событий опрашивает очередь событий?

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

Знает ли поток javascripts о цикле событий? Или цикл Event просто помещает вещи в стек?

Я бы сказал, что JavaScript работает в потоке цикла событий. Цикл событий просто несколько раз извлекает события из очереди и выполняет их JavaScript.

Как цикл Event узнает, когда стек очищен?

Цикл обработки событий вызывает выполнение javascript, поэтому при возврате javascript стек очищается.