동시성 제어
- p-limit:
p-limit
은 비동기 작업의 동시 실행 수를 제한합니다. 최대 동시 작업 수를 설정하고, 이를 초과하는 작업은 대기하게 됩니다. - async-mutex:
async-mutex
는 뮤텍스를 사용하여 동시성을 제어합니다. 잠금을 획득한 작업만이 특정 코드 블록에 접근할 수 있으며, 잠금 해제는 명시적으로 수행해야 합니다. - async-lock:
async-lock
은 특정 코드 블록에 대한 동시 접근을 완전히 차단합니다. 하나의 작업이 잠금을 획득하면 다른 작업은 잠금이 해제될 때까지 대기해야 합니다. - async-sema:
async-sema
는 세마포어를 사용하여 동시성 제어를 수행합니다. 최대 동시 작업 수를 설정할 수 있으며, 설정된 수만큼의 작업이 동시에 실행될 수 있습니다. - semaphore-async-await:
semaphore-async-await
은 세마포어를 사용하여 비동기 작업의 동시성을 제어합니다. 세마포어의 카운트를 설정하여 최대 동시 작업 수를 제한할 수 있습니다.
API 디자인
- p-limit:
p-limit
은 비동기 작업을 제한하는 간단한 API를 제공합니다. 작업을 실행할 때 최대 동시 실행 수를 설정할 수 있습니다. - async-mutex:
async-mutex
는 뮤텍스와 관련된 API를 제공합니다. 잠금 획득, 해제, 그리고 잠금 상태를 확인하는 기능이 포함되어 있습니다. - async-lock:
async-lock
은 간단하고 직관적인 API를 제공합니다. 잠금을 획득하고 해제하는 과정이 명확하여 사용하기 쉽습니다. - async-sema:
async-sema
는 세마포어를 설정하고, 획득하고, 해제하는 API를 제공합니다. 세마포어의 현재 상태를 확인할 수 있는 기능도 포함되어 있습니다. - semaphore-async-await:
semaphore-async-await
은 세마포어를 관리하는 API를 제공합니다. 세마포어를 획득하고 해제하는 과정이 명확하게 정의되어 있습니다.
유연성
- p-limit:
p-limit
은 동시 실행 수를 제한하는 간단한 방식이므로 유연성이 제한적입니다. 그러나 여러 작업에 동일한 제한을 쉽게 적용할 수 있습니다. - async-mutex:
async-mutex
는 뮤텍스를 사용하여 잠금을 관리하므로, 잠금 해제 시점을 개발자가 제어할 수 있어 유연성이 높습니다. - async-lock:
async-lock
은 특정 코드 블록에 대한 잠금을 제공하므로 유연성이 제한적입니다. 그러나 여러 개의 잠금을 동시에 관리할 수 있는 기능이 있어 일부 유연성을 제공합니다. - async-sema:
async-sema
는 세마포어의 최대 동시 작업 수를 설정할 수 있어 유연성이 높습니다. 필요에 따라 동시성 수준을 조정할 수 있습니다. - semaphore-async-await:
semaphore-async-await
은 세마포어를 사용하여 동시성을 제어하므로, 세밀한 제어가 가능합니다. 필요에 따라 동시성 수준을 조정할 수 있습니다.
예제 코드
- p-limit:
p-limit
예제const pLimit = require('p-limit'); const limit = pLimit(2); // 최대 2개의 동시 작업 let resource = 0; const tasks = Array.from({ length: 5 }, (_, i) => limit(async () => { const temp = resource; await new Promise(resolve => setTimeout(resolve, 1000)); // Simulate async work resource = temp + 1; })); Promise.all(tasks).then(() => { console.log(resource); // 5 });
- async-mutex:
async-mutex
예제const { Mutex } = require('async-mutex'); const mutex = new Mutex(); let resource = 0; async function updateResource() { const release = await mutex.acquire(); const temp = resource; await new Promise(resolve => setTimeout(resolve, 1000)); // Simulate async work resource = temp + 1; release(); } Promise.all([updateResource(), updateResource()]).then(() => { console.log(resource); // 2 });
- async-lock:
async-lock
예제const AsyncLock = require('async-lock'); const lock = new AsyncLock(); let resource = 0; function updateResource() { return lock.acquire('key', async () => { const temp = resource; await new Promise(resolve => setTimeout(resolve, 1000)); // Simulate async work resource = temp + 1; }); } Promise.all([updateResource(), updateResource()]).then(() => { console.log(resource); // 2 });
- async-sema:
async-sema
예제const { Sema } = require('async-sema'); const sema = new Sema(2); // 최대 2개의 동시 작업 let resource = 0; async function updateResource() { await sema.acquire(); const temp = resource; await new Promise(resolve => setTimeout(resolve, 1000)); // Simulate async work resource = temp + 1; sema.release(); } Promise.all([updateResource(), updateResource(), updateResource()]).then(() => { console.log(resource); // 3 });
- semaphore-async-await:
semaphore-async-await
예제const { Semaphore } = require('semaphore-async-await'); const semaphore = new Semaphore(2); // 최대 2개의 동시 작업 let resource = 0; async function updateResource() { const permit = await semaphore.acquire(); const temp = resource; await new Promise(resolve => setTimeout(resolve, 1000)); // Simulate async work resource = temp + 1; permit.release(); } Promise.all([updateResource(), updateResource(), updateResource()]).then(() => { console.log(resource); // 3 });