PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Как возможно выполнение двух параллельных синхронных операций?

Продвинутые темы

Две параллельные синхронные операции в самом JavaScript невозможны — он однопоточный, одна операция за раз. Настоящий параллелизм достигается через Web Workers (отдельные потоки).

Однопоточность JS

Основной поток JavaScript выполняет одну операцию за раз (один call stack). Два синхронных куска кода не выполняются одновременно в основном потоке:

heavyWork1(); // сначала это
heavyWork2(); // потом это — не параллельно

Как достичь параллелизма

Web Workers (браузер)

Отдельные потоки, выполняющиеся параллельно основному (на многоядерном CPU):

const worker = new Worker('compute.js');
worker.postMessage(data);       // задача в отдельный поток
worker.onmessage = (e) => {};   // результат
  • Настоящий параллелизм для тяжёлых вычислений.
  • Нет доступа к DOM, обмен через сообщения (postMessage).
  • Общая память — через SharedArrayBuffer (осторожно, гонки).

Worker Threads (Node.js)

Аналог для серверного JS.

Что НЕ является параллелизмом

  • Асинхронность (Promise, setTimeout) — не параллельна: код чередуется в одном потоке, операции ждут вне потока (I/O), но выполняются по очереди.
// Не параллельно — чередование в одном потоке
await fetchA();
await fetchB();

Главное

  • Синхронный параллелизм в основном потоке невозможен (однопоточность).
  • Настоящий параллелизм — только через Workers (отдельные потоки).
  • Асинхронность ≠ параллелизм (про ожидание, не про одновременное выполнение).

Коротко для собеседования

Две параллельные синхронные операции в основном потоке JS невозможны — он однопоточный (одна операция за раз). Настоящий параллелизм даёт только Web Workers (браузер) / Worker Threads (Node) — отдельные потоки на разных ядрах, обмен через postMessage. Асинхронность (Promise) — не параллелизм, а чередование в одном потоке.

Другие вопросы раздела