Проверяет понимание работы event loop и ограничений при параллельном выполнении большого количества асинхронных задач в среде выполнения JavaScript.
Когда вы запускаете 10000 асинхронных задач одновременно, они не выполняются параллельно в разных потоках. В JavaScript используется однопоточная модель с event loop. Каждая async-функция возвращает Promise, и при вызове они ставятся в очередь микрозадач (microtask queue). Event loop последовательно извлекает задачи из этой очереди и выполняет их одну за другой.
// Проблемный подход
const tasks = Array(10000).fill().map(() => asyncTask());
await Promise.all(tasks); // Блокирует event loop
// Решение с контролем параллелизма
async function runWithLimit(tasks, limit) {
const results = [];
const executing = new Set();
for (const task of tasks) {
const p = task().then(result => {
executing.delete(p);
return result;
});
executing.add(p);
results.push(p);
if (executing.size >= limit) {
await Promise.race(executing);
}
}
return Promise.all(results);
}
await runWithLimit(tasks, 10); // Одновременно выполняется только 10 задачТакой подход используется при обработке больших объемов данных, массовых запросах к API, загрузке файлов или парсинге. Библиотеки вроде p-limit, async или собственные реализации очередей помогают избежать проблем.
Вывод: Запуск 10000 async-задач без контроля параллелизма может заблокировать event loop и привести к зависанию приложения. Используйте ограничение параллелизма для эффективного управления ресурсами и поддержания отзывчивости интерфейса.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на Python Developer в телеграм