How are the Event Loop, Callback Queue, and Javascript's single thread connected?

ОБЩАЯ ЦЕЛЬ

Я хотел бы знать, как следующие части среды javascript связаны как система.

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

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

Вещи, которые я (верю) понимаю

  • 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…')

ПРИМЕРНЫЕ ШАГИ:

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

  1. "Код синхронизации запущен…"
  2. setTimeout добавляется в стек, но сразу возвращает управление
  3. setTimeout отправляется другому "потоку"… "работнику"? вне одного потока javascript для подсчета 2000 миллисекунд
  4. "Код синхронизации завершен…"
  5. После 2000 миллисекунд asyncLog() отправляется в очередь событий
  6. Поскольку callstack очищен, цикл обработки событий проверяет очередь событий на наличие ожидающих обратных вызовов.
  7. asyncLog() удаляется из очереди и помещается в стек с помощью цикла обработки событий
  8. "Асинхронная функция выполнена"
  9. CallCack теперь ясно

ВОПРОСЫ

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

  1. На шаге 3, кто создает эту новую тему? Это браузер?
    • Эта новая тема блокируется правильно?
    • Что произойдет, если у вас есть цикл, который создает 1000 setTimeouts. 1000 "потоков" созданы?
    • Есть ли ограничение на количество потоков, которые могут быть созданы одновременно?
    • Когда новый поток завершает работу, как он попадает в очередь?
  2. Кто поставляет Очередь Событий?
  3. Кто поставляет Event Loop?
    • Цикл событий опрашивает очередь событий?
    • Знает ли поток JavaScript о цикле событий? Или цикл Event просто помещает вещи в стек?
    • Как цикл Event узнает, когда стек очищен?

1 ответ

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам