Параллелизм: в основном он связан с одновременным выполнением нескольких задач. Задачи выполняются практически одновременно, но не точно. Он использует квантование времени ЦП, когда каждая задача выполняет какую-то часть, а затем переходит в режим ожидания. Когда первая задача ожидает, ЦП назначается второй задаче для выполнения своей части задачи. Конечным пользователям кажется, что задача выполнена одновременно.

Как это работает в Javascript?

С такими языками, как Java, мы можем добиться параллелизма, используя множество потоков, но javascript - это однопоточный язык. У него есть единственный стек вызовов, который выполняет одно действие за раз.

Стек вызовов - это структура данных, которая записывает, где мы находимся в программе. Он следует модели «Последний пришел - первым ушел».

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

Возьмем пример:

Ввод:

Input:
console.log(“HI”); // 1
setTimeout(function() { // 2
  console.log(“There”);
}, 5000);
console.log(“JS Rocks”); // 3
Output:
HI
JS Rocks
There

В приведенном выше коде setTimeout - это веб-API браузера, не предоставляемый движком JS V8 Engine. Причина, по которой мы можем делать что-то одновременно, потому что браузеры предоставляют нам веб-API, которые можно запускать как потоки, и браузеры знают об этом параллелизме.

Как показано на диаграмме ниже, setTimeout является частью веб-API, и когда он будет завершен, то есть в этом случае через 5 секунд (или 5000 мс) он будет помещен в очередь задач (очередь обратного вызова), а затем наступит цикл событий

Цикл событий имеет простую задачу просмотра стека вызовов и очереди задач. Если стек вызовов пуст, он будет помещать события в очередь задач в стек вызовов. В приведенном выше коде операторы 1 и 3 отправятся в стек вызовов, а оператор 2 будет веб-API, который будет помещен в очередь задач после его завершения. Таким образом, цикл событий увидит, что стек вызовов выполняет операторы 1 и 3, а затем просматривает очередь задач, помещает ее в стек вызовов (когда она пуста) и выполняет ее.

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