JaveScript/NodeJS

Node.js 어플리케이션 단에서 동시성 처리하기

알면 알 수록 재밌다! 2024. 6. 20. 14:00

 

공유 자원(예: 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 함수를 여러 번 호출하여 비동기로 실행합니다.

이 방법은 어플리케이션 단에서 메모리 내에서 데이터를 관리하고, 락을 통해 동시 접근을 제어하여 데이터의 일관성을 유지할 수 있게 해줍니다.

 

 


참고

 

https://moony211.medium.com/node-js%EC%97%90%EC%84%9C-%EA%B3%B5%EC%9C%A0-%EB%A6%AC%EC%86%8C%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EB%8F%99%EA%B8%B0%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-async-mutex-%EC%82%AC%EC%9A%A9-515207bb9b28

 

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