Проверяет понимание семафоров как механизма синхронизации доступа к общим ресурсам в многопоточном программировании.
Семафор — это примитив синхронизации, который управляет доступом к общему ресурсу с помощью целочисленного счетчика. В отличие от мьютекса, который позволяет только одному потоку войти в критическую секцию, семафор может разрешить доступ ограниченному числу потоков одновременно. Это особенно полезно, когда ресурс имеет несколько экземпляров, например, пул соединений с базой данных или ограниченное количество слотов в очереди.
Семафор поддерживает две атомарные операции: wait (также называется P или acquire) и signal (также V или release). При вызове wait счетчик уменьшается на единицу; если он становится отрицательным, поток блокируется. При вызове signal счетчик увеличивается, и если есть заблокированные потоки, один из них разблокируется.
class Semaphore {
constructor(max) {
this.max = max;
this.count = 0;
this.queue = [];
}
async acquire() {
if (this.count < this.max) {
this.count++;
return;
}
await new Promise(resolve => this.queue.push(resolve));
this.count++;
}
release() {
this.count--;
if (this.queue.length > 0) {
const next = this.queue.shift();
next();
}
}
}
// Использование: ограничиваем 2 одновременных запроса
const sem = new Semaphore(2);
async function fetchData(url) {
await sem.acquire();
try {
const res = await fetch(url);
return res.json();
} finally {
sem.release();
}
}Семафоры — мощный инструмент для контроля конкурентного доступа, когда нужно разрешить несколько одновременных использований ресурса, но не больше заданного лимита. Их стоит применять в системах с ограниченными ресурсами, очередями и пулами, чтобы избежать деградации производительности и гонок данных.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на Golang Developer в телеграм