class Semaphore {
constructor(max) {
this.max = max;
this.available = max;
this.waiting = [];
}
async acquire() {
return new Promise((resolve) => {
if (this.available > 0) {
this.available--;
resolve();
} else {
this.waiting.push(resolve);
}
});
}
release() {
if (this.waiting.length > 0) {
const resolve = this.waiting.shift();
resolve();
} else {
this.available++;
}
}
}
const semaphore = new Semaphore(2);
async function task(i) {
await semaphore.acquire();
console.log(`Task ${i} started`);
await new Promise(resolve => setTimeout(resolve, 1000));
console.log(`Task ${i} finished`);
semaphore.release();
}
for (let i = 0; i < 5; i++) {
task(i);
}