Как в асинхронном коде параллельно запустить две задачи?

Параллельное выполнение задач в асинхронном коде асинхронность в JS и Python (Node.js, asyncio) Promise.all / asyncio.gather — одновременно запускают задачи и ожидают завершения каждой из них запуск задач без await —…

Короткий ответ

Что ответить на собеседовании

Параллельное выполнение задач в асинхронном коде асинхронность в JS и Python (Node.js, asyncio) Promise.all / asyncio.gather — одновременно запускают задачи и ожидают завершения каждой из них запуск задач без await — задачи инициируются и начинают выполняться практически одновременно use setTimeout/setImmediate для отложенного асинхронного запуска (в специальных случаях) Web Workers / ThreadPool (Node.js Worker Threads) — потоковый параллелизм для CPU-bound операций Fork/Spawn процессов для изоляции задач и их масштабирования на практике: для I/O-bound операций применяют Promise.all/asyncio.gather, а для CPU-bound — воркеры

Подробный разбор

Ответ с пояснениями

Параллельное выполнение задач в асинхронном коде

  • асинхронность в JS и Python (Node.js, asyncio)
  • Promise.all / asyncio.gather — одновременно запускают задачи и ожидают завершения каждой из них
  • запуск задач без await — задачи инициируются и начинают выполняться практически одновременно
  • use setTimeout/setImmediate для отложенного асинхронного запуска (в специальных случаях)
  • Web Workers / ThreadPool (Node.js Worker Threads) — потоковый параллелизм для CPU-bound операций
  • Fork/Spawn процессов для изоляции задач и их масштабирования
  • на практике: для I/O-bound операций применяют Promise.all/asyncio.gather, а для CPU-bound — воркеры

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

Подробный ответ

Основной ответ

В асинхронной программе две задачи можно запустить одновременно несколькими способами — конкретный вариант зависит от языка и фреймворка. В JavaScript и Python, широко используемых для асинхронного программирования, обычно применяют промисы (Promises), а также async/await в сочетании с механизмами параллельного запуска.

Ключевые моменты

  • JavaScript (ES6+):
  • Метод Promise.all([task1, task2]) инициирует обе задачи параллельно и ожидает завершения каждой. Если одна из них завершится с ошибкой, Promise.all будет немедленно отклонён.
  • С помощью Promise.allSettled можно дождаться окончания обеих задач независимо от того, завершились они успешно или с ошибкой.

Другой вариант — инициировать задачи без await, например: js const p1 = task1(); const p2 = task2(); await p1; await p2; — в этом случае оба промиса начинают выполняться почти одновременно.

Python (asyncio):

  • asyncio.gather(task1(), task2()) параллельно запускает несколько корутин и объединяет полученные результаты. Если одна корутина завершится исключением, соответствующее поведение задаётся параметром return_exceptions=True.
  • Вызов asyncio.create_task() формирует отдельные задачи и сразу передаёт их на планирование, благодаря чему несколько тасков могут выполняться параллельно. Ждать их завершения затем можно отдельно через await.

Во всех перечисленных случаях Python использует event loop: параллелизм обеспечивается переключением контекста, поэтому такой подход особенно эффективен для I/O-bound задач.

Общий контекст:

  • Параллельное выполнение не обязательно предполагает многопоточность: нередко речь идёт о конкурентной асинхронной работе в рамках одного потока. Для CPU-bound операций требуется иной механизм — например, multiprocessing в Python или worker threads в Node.js.
  • Также необходимо заранее продумать обработку ошибок и таймауты, чтобы одна "тяжёлая" задача не задерживала выполнение другой.

Практический контекст

В прикладных проектах — например, в Node.js (React 18+, Express) или Python с FastAPI — для параллельных обращений к базе данных и внешним API часто используют Promise.all и asyncio.gather. Это заметно сокращает суммарную задержку и увеличивает throughput. Способ обработки ошибок и таймаутов при этом выбирают с учётом бизнес-логики.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку