yb__char
개발은 늘 어려워
yb__char
전체 방문자
오늘
어제
  • 분류 전체보기 (37)
    • 일상 (2)
    • 코딩테스트 (1)
    • Spring (7)
    • 면접 대비 (2)
    • Java (4)
    • Git (3)
    • CleanCode (1)
    • 데이터베이스 (4)
      • SQL (2)
    • 후기 (2)
    • Nestjs (0)
      • Code (0)
      • Typescript (0)
    • Javascript (6)
      • Async (2)
      • lodash (3)
    • iOS (5)
      • Swift 문법 (5)
      • SwiftUI (0)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
yb__char

개발은 늘 어려워

[Async] waterfall, parallel로 흐름 제어
Javascript/Async

[Async] waterfall, parallel로 흐름 제어

2022. 6. 13. 12:36

이전 포스팅한 async 정의에 대해 다뤄봤고 이번엔 async에서 자주 사용하는 메서드를 알아볼 것이다.

1. waterfall

waterfall 함수는 비동기 함수를 순차적으로 실행하지만 각 작업의 결과를 다음 작업으로 넘겨주어 최종적으로 결과값을 return 한다.

async.waterfall(작업리스트, 완료 콜백)

 

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의 흐름 제어 방식이다.

parallel 흐름 제어

async함수 A, B, C를 동시에 수행하고 모든 작업이 끝나면 최종 callback 함수로 넘어간다.

에러 처리는 parallel로 수행중이던 task중에 에러가 발생하면, 바로 최종 callback에 에러를 넘긴다. 단 이때 에러가 발생하지 않은 task들은 수행을 멈추지 않고 끝까지 수행되다.

parallel 수행 과정

 

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
    'Javascript/Async' 카테고리의 다른 글
    • [Async] async 라이브러리
    yb__char
    yb__char
    안녕하세요 백엔드 개발자 차윤범입니다.

    티스토리툴바