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개를 한번에 병렬로 처리할 때 보다 효율도 더 늘어난 느낌이였다.