Node.js 어플리케이션 단에서 동시성 처리하기
공유 자원(예: map, array 등)에 대해 비동기 코드가 동시에 접근할 때 동시성 문제가 발생할 수 있습니다.
자바스크립트는 단일 스레드 모델
자바스크립트는 기본적으로 단일 스레드에서 동작합니다. 이는 한 번에 하나의 작업만을 실행할 수 있다는 것을 의미합니다.
비동기 작업(예: 파일 읽기, 네트워크 요청 등)은 이벤트 루프를 통해 처리되며, 이러한 작업이 완료되면 콜백 큐에 추가되어 메인 스레드가 사용 가능할 때 실행됩니다.
Node.js는 개발자가 스레드 간의 동기화 문제를 걱정할 수 없게 설계가 되어있습니다.
이러한 단일 스레드 모델은 여러 비동기 작업이 동시에 공유 자원에 접근할 때 동시성 문제를 일으킬 수 있습니다.
예를 들어, 여러 비동기 함수가 동시에 배열에 값을 추가하거나 변경하려고 하면, 예기치 않은 결과가 발생할 수 있습니다.
기본적인 자바스크립트 런타임 환경에서는 이러한 동시성 문제를 해결하기 위한 메커니즘이 없기 때문에, 외부 라이브러리를 사용하여 동시성 제어를 어플리케이션 단에서 처리할 수 있습니다.
설치
npm install async-mutex
예시
const { Mutex } = require('async-mutex');
const mutex = new Mutex();
let counter = 1;
async function incrementCounter() {
console.log(`Attempting to acquire the lock at ${new Date().toISOString()}`);
const startAcquire = Date.now();
// mutex lock the counter
await mutex.acquire();
const endAcquire = Date.now();
const acquireTime = endAcquire - startAcquire;
console.log(`Lock acquired at ${new Date().toISOString()} after ${acquireTime} ms`);
try {
const workTime = Math.floor(Math.random() * 1000);
console.log(`Counter is now ${counter}. Working for ${workTime} ms`);
counter++;
await new Promise(resolve => setTimeout(resolve, workTime));
} finally {
// Release the mutex to unlock the counter
mutex.release();
console.log(`Lock released at ${new Date().toISOString()}`);
}
}
const promises = [];
for (let i = 0; i < 10; i++) {
promises.push(incrementCounter());
}
메모리에 데이터를 저장하고, 배열에 incrementCounter 함수를 여러 번 호출하여 비동기로 실행합니다.
이 방법은 어플리케이션 단에서 메모리 내에서 데이터를 관리하고, 락을 통해 동시 접근을 제어하여 데이터의 일관성을 유지할 수 있게 해줍니다.
참고
Node.js에서 공유 리소스에 대한 동기화를 위한 async-mutex 사용
공유 리소스는 프로그래밍에서 중요한 부분이다. 여러 스레드 또는 비동기 작업이 공유 리소스에 동시에 액세스할 수 있으므로 동기화 문제와 데이터 경합이 발생할 수 있다. 이러한 문제를 방
moony211.medium.com
https://www.npmjs.com/package/async-mutex
async-mutex
A mutex for guarding async workflows. Latest version: 0.5.0, last published: 3 months ago. Start using async-mutex in your project by running `npm i async-mutex`. There are 993 other projects in the npm registry using async-mutex.
www.npmjs.com