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

В случае синхронного кода Javascript будет выполняться построчно. Вот пример:

1. let a = 5;
2. let b = 10;
3. let c = b/a;
4. print(c)

Каждая строка выполняется одна за другой. Синхронный код также называют блокирующим. Это связано с тем, что строка 2 не может быть выполнена до тех пор, пока не завершится выполнение строки 1. Вы можете не осознавать «блокировку» в этом примере, потому что операции обычно выполняются быстро.

1. let a = 5, b = 10;
2. let result = calculationOverNetwork(a,b)
3. let c = 15, d = 30;
4. let result2 = d/c;
5. print(result2)

В приведенном выше примере строка 2 включает сетевой вызов, выполнение которого занимает две минуты. Пока происходит этот вызов, вы не можете перейти к строке 3, даже если вычислительная мощность вашей машины позволяет выполнять вычисления в это время.

Именно здесь концепция параллелизма становится важной в Javascript. Учитывая, что язык является однопоточным, в отличие от других языков, таких как Java, которые могут использовать несколько потоков для достижения параллелизма, этот любопытный случай параллелизма в JS становится еще более интересным.

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