이전 포스팅한 async 정의에 대해 다뤄봤고 이번엔 async에서 자주 사용하는 메서드를 알아볼 것이다.
1. waterfall
waterfall 함수는 비동기 함수를 순차적으로 실행하지만 각 작업의 결과를 다음 작업으로 넘겨주어 최종적으로 결과값을 return 한다.
async.waterfall(작업리스트, 완료 콜백)
이 그림은 비동기 함수 asyncfunctionaA, asyncfunctionB,asyncfunctionC 를 순차적으로 실행하고, 각 단계에서 다온 리턴값을 다음 단계로 넘기는 waterfall 흐름의 개념을 표현하고 있다.
각각의 단계에서 처리되는 함수를 async에서는 task라고 정의한다.
이 task가 모두 수행이 끝나면, 맨 마지막에 정의된 callback 함수가 수행된다.
만약 task 수행도중에 에러가 발생하면, task 수행을 멈추고 callback 함수를 바로 호출하는데, 이때 err라는 인자에 에러 내용을 채워서 넘긴다. 맨 마지막 callback함수는 err에 null이면 정상적으로 모든 task들이 성공적으로 호출된것으로 처리하고,
만약에 null이 아닌경우 task 수행도중에 에러가 난것으로 파악하여 에러 처리를 한다.
async.waterfall(
// waterfall 작업 리스트
[
function(callback) {
if(err){
callback("실패1");
}
callback(null, "성공1");
},
function(arg1, arg2, callback){
if(err){
callback("실패2");
}
// arg1: "성공1", arg2 : 1
console.log(arg1, arg2);
callback(null, "성공2");
},
function(arg1, callback){
if(err){
callback("실패3");
}
// arg1 : "성공2"
// 위 함수에서 성공한 값을 순차처리하여 "성공2"를 받아옴
console.log(arg1);
callback(null, "성공3");
}
],
// 완료
function(err, result){
// 작업 리스트 중 error가 발생되면 err 값을 전달받아 logging
if(err){
console.log(err);
}
// 결과값 : "성공3" 출력
console.log(result);
}
);
위와 같이 waterfall 작업리스트 내에 순차적으로 함수를 처리하여 결과값을 전달받아 다음 함수가 처리하는 식으로 사용된다.
2. parallel
이번엔 parallel을 알아볼 것이다. parallel은 이름에서도 확인할 수 있듯이 동시에 여러 개의 task를 처리하는 방법으로, 마치 멀티 쓰레드와 같은 효과를 낼 수 있다. 즉, waterfall과 달리 실행 시간을 단축시킬 수 있다.
async.parallel(작업리스트, 완료 콜백)
아래 그림은 parallel의 흐름 제어 방식이다.
async함수 A, B, C를 동시에 수행하고 모든 작업이 끝나면 최종 callback 함수로 넘어간다.
에러 처리는 parallel로 수행중이던 task중에 에러가 발생하면, 바로 최종 callback에 에러를 넘긴다. 단 이때 에러가 발생하지 않은 task들은 수행을 멈추지 않고 끝까지 수행되다.
parallel흐름 제어를 사용할때 주의해야 할 점은 멀티 쓰레드처럼 작업을 수행해주는 것이지 실제 멀티 쓰레드가 아니다.
I/O작업등이 있는 task들의 경우 I/O 요청을 보내놓고, 응답이 올때 까지 다른 task를 실행해서 병렬로 실행하는 것과 같은 효과를 주는 것이다.
만약에 task자체가 I/O작업등이 없고 계속해서 CPU를 사용한다면, 그 작업이 끝난후에 다음 task로 넘어가기 때문에, 병렬 처리가 일어나지 않는다. (이런 경우에는 series를 쓰는 것이 낫다.)
parallel이 효과적으로 사용될 수 있는 곳은 I/O쪽인데, 원격으로 여러개의 REST API를 동시 호출하거나, 또는 동시에 여러개의 쿼리를 조회하는 것들에 효과적으로 사용할 수 있다.
그리고 완료된 작업들은 result 변수내에 배열 타입으로 결과들이 들어갈 것이지만, 객체도 사용하는 것에 따라 가능하다.
async.parallel(
// parallel 작업 리스트
[
function(callback){
if(err){
callback("실패1");
}
callback(null, "성공1");
},
function(callback){
if(err){
callback("실패2");
}
callback(null, "성공2");
},
function(callback){
if(err){
callback("실패3");
}
callback(null, "성공3");
}
],
// 완료
function(err, results){
//parallel 콜백
if(err){
// 작업 리스트 중 error가 발생되면 err 값을 전달받아 logging
console.log(err);
}
// result : ["성공1", "성공2", "성공3"]
console.log(result);
}
);
이와 같이 parallel은 function 작업 리스트를 병렬로 실행하여 실행시간 단축시킬 수 있다.
nodejs를 이용한 비동기 처리에 따른 콜백 지옥을 벗어나고자 async 라이브러리를 사용하고, 프로젝트에 따른 프로세스 처리 방식인 waterfall과 parallel에 대해 알아봤다.
출처: https://bcho.tistory.com/1083 [조대협의 블로그:티스토리]
'Javascript > Async' 카테고리의 다른 글
[Async] async 라이브러리 (2) | 2022.06.10 |
---|