본문 바로가기
JavaScript

promise 를 이용한 함수 병렬처리

by 갈잃자 2024. 4. 15.

개요: 회사 어플을 이용하는 20000명 고객을 모든 수술에 대하여(7000개) 계산한 후, 보험금 데이터를 저장하려 함.


그러나, 1명당 1개의 수술에 대해 보험 데이터 계산하고 가져오는데, 0.1 초가 걸림 (실제 데이터를 가져오는데엔 0.01초 정도 걸릴텐데 렌더링 + 로그 확인까지 하면 0.1초 정도 소요되는거 같음). 그말은 즉슨, 비동기적으로 전처리를 하지 않는 이상, 시간이 많이 소요가 될 수밖에 없는 상황이옴...

 

(대략 계산해보니, 20000명 * 7000개의 수술 * 0.1초 = 162일 이상)

 

162일 동안 함수를 돌릴수도 없고, 최대한 빠른시간안에 처리가 될 비동기와 메모리 오류를 내지 않을 배치 작업이 필요함.

 

그렇다면, 한명의 고객을 7000개 수술에 한번에 보험금을 계산한다면?

 

7000개를 한번에 돌리면, 메모리 오류로 서버나, 클라이언트가 먹통이 될 수 있으니, 100개를 한번에 돌리는 걸로 지정하고, for문을 통해 70번 나눠주면 좋을거같다. 그렇다면, 1명당 1초의 시간꼴로 해결할 수 있을거같음.

 

근데 코드를 어떻게 짜냐... 에혀 일단 연습삼아 만들어 보겠음.

 

  async function batchFunctions() {
  	// 100길이의 배열을 생성한 뒤, 그 안에, 1을 출력하는 함수를 넣어줌
    const functions = Array.from({ length: 100 }, () => {
      return function() {
          console.log(1);
      };
  });

    for (let i = 0; i < 70; i++) { // 7000개를 100개씩 돌리기 위해 for문 사용
        const promises = functions.map(fn => new Promise(resolve => setTimeout(() => resolve(fn()), 10))); //100개마다 1ms로 시간텀을 줌
        
        
        await Promise.all(promises); // Promise.all로 promises 배열안의 promise를 한번에 병렬처리함
    }
  }

  batchFunctions();

 

프로미스로 함수동작을 생성한 뒤, promise.all로 해당 배열내의 함수를 한번에 처리시킴.

 

연습은 잘 됬으니, 한번 적용시켜서 만들어 보겠뜸

댓글