본문 바로가기
Study/Go

[Go] 고루틴(GoRoutine) 심화(7) - 파이프라인

by _royJang 2022. 6. 24.

유래

파이프라인은 한 곳에서 다른 곳으로 액체를 옮기기 위해 사용한 파이프들의 집합을 말한다. 컴퓨터에서 말하는 파이프라인 역시 이와 마찬가지로 어떤 위치에서 다른 위치로 데이터를 처리 후 운반하기에 이와 같은 용어를 사용하는 것으로 보인다.

파이프라인이란?

시스템에서 추상화를 구성하는 데 사용할 수 있는 도구이다. 특히 Stream이나 Batch 작업들을 처리해야 할 때에는 특히 탁월한 효과를 낸다.

각 단계의 관심사를 분리할 수 있다. 그로써 다양한 이점을 얻을 수 있다.

1. 상호 독립적으로 단계를 수정할 수 있다.

2. 단계들의 결합 방식을 짜맞출 수 있다.

3. 일부분을 팬 아웃하거나 속도를 제한할 수 있다.

파이프라인의 특성

1. 각 단계는 동일한 타입을 소비하고 리턴한다.

2. 각 단계에서 함수의 매개변수로 함수가 사용될 수 있어야 한다.

먼저 파이프라인을 사용하지 않은 우리에게 익숙한 코드를 살펴보자.

ints := []int{1, 2, 3, 4}
for _, v := range ints {
   fmt.Println(2*v + 1)
}

단순한 반복문의 익숙한 함수이다.

우리는 이 방법이 훨씬 간단해 보이지만 이전에 언급했던 파이프라인을 사용함으로써 얻을 수 있는 장점들을 얻을 수 없다.

파이프라인을 사용한 간단한 예시 코드이다.

func Exam1() {
   multiply := func(values []int, multiplier int) []int {
      multipliedValues := make([]int, len(values))
      for i, v := range values {
         multipliedValues[i] = v * multiplier
      }
      return multipliedValues
   }

   add := func(values []int, additive int) []int {
      addedValues := make([]int, len(values))
      for i, v := range values {
         addedValues[i] = v + additive
      }
      return addedValues
   }

   ints := []int{1, 2, 3, 4}

   for _, v := range add(multiply(ints, 2), 1) {
      fmt.Println(v)
   }
}

실행결과

3
5
7
9