꾸준히 공부하는 개발자

[Node.js] bluebird.js Promise (concurrency) 본문

Node.js

[Node.js] bluebird.js Promise (concurrency)

kauboy 2019. 12. 18. 21:23
import Bluebird from 'bluebird'
const handlerFile = await Bluebird.map(data, item => new Bluebird(async (resolve, reject) => {
      setTimeout(async () => {
        try {
          if (item.mainImages) await uploadToS3(item, 'mainImages', 'images', null, 'products')
          setLoadingCount(prevCount => prevCount + 1)
        } catch (e) {
          setLoadingCount(prevCount => prevCount + 1)
          item.mainImages = []
          console.log(e)
        }
        try {
          if (item.detailImages) await uploadToS3(item, 'detailImages', 'images', null, 'products')
          setDetailLoadingCount(prevCount => prevCount + 1)
        } catch (e) {
          setDetailLoadingCount(prevCount => prevCount + 1)
          item.detailImages = []
          console.log(e)
        }
        resolve(item)
      }, 0);
    }), {concurrency: 15})

javascript는 다 아시듯이 단일스레드 언어이다.
한번에 많은양의 데이터를 Promise.all로 병렬로 처리하다가 s3 주소가 만료되어 에러가 나는 상황이 발생하였다.
여기서 bluebird Promise로 concurrency를 지정해줘서 일정 수 만큼만 병렬로 처리하게끔 해결해주었다.
이랬더니 왠지 100개를 한번에 병렬로 처리할 때 보다 효율도 더 늘어난 느낌이였다.

출처: http://bluebirdjs.com/docs/getting-started.html

Comments