Chapter 17

타임라인 조율하기

  • 17.1 두 타임라인이 끝날 때까지 기다리기
  • 17.2 Cut() — 동시성 기본형
  • 17.3 Cut()의 구현
  • 17.4 병렬 실행 분석
  • 17.5 동시성 기본형 조합하기

동시성 기본형은 작고 재사용 가능한 도구로 만들고, 필요에 따라 조합해서 쓰는 게 함수형 접근이야.

16장에서 큐를 배웠지. 큐는 타임라인을 직렬화하는 도구야. 하지만 때로는 여러 작업을 동시에 실행하되, 모두 끝난 후에 다음 단계로 가고 싶을 때가 있거든. MegaMart의 새 요구사항이 딱 그래: "상품 가격과 배송비를 동시에 가져온 후, 둘 다 도착하면 합계를 DOM에 표시해줘." 두 비동기 요청이 언제 끝날지 모르는데, 둘 다 끝나야 합계를 계산할 수 있잖아. "둘 다 끝남"을 어떻게 알 수 있을까?

저자가 만드는 해결책이 **Cut()**이야. 다른 언어에서는 "CountDownLatch", "Barrier" 같은 이름으로 부르는 것과 비슷한 개념이야. Cut의 아이디어는 N개의 타임라인이 모두 끝나면 콜백을 실행하는 거야. 각 타임라인이 끝날 때마다 카운터를 하나씩 줄이고, 카운터가 0이 되면 콜백 실행.

function Cut(num, callback) {
  var num_finished = 0;
  return function() {
    num_finished += 1;
    if (num_finished === num)
      callback();
  };
}

겨우 6줄인데, 이 안에 중요한 설계가 있어. num_finished클로저 안에 있어서 외부에서 접근 불가하고, 한 번만 실행돼 — num_finishednum에 도달한 후에는 다시 === 조건이 참이 되지 않으니까.

사용은 이렇게 해:

function calc_cart_total(cart, callback) {
  var total = 0;
  var done = Cut(2, function() {
    callback(total);
  });

  calc_cart_subtotal(cart, function(subtotal) {
    total += subtotal;
    done();  // 1/2 완료
  });

  calc_shipping(cart, function(shipping) {
    total += shipping;
    done();  // 2/2 완료 → callback 실행
  });
}

두 응답이 어떤 순서로 오든 done()이 두 번 호출되면 callback(total)이 실행돼. Cut은 타임라인을 합류시키는 역할을 하지. 두 갈래로 나뉘었던 타임라인이 다시 하나로 합쳐지는 지점이야. Cut을 사용하면 Cut 이전의 순서는 상관없고, Cut 이후에는 모든 데이터가 준비되어 있으니, 분석할 조합 수가 크게 줄어들어.

큐(16장)와 Cut(17장)을 조합할 수도 있어. 예를 들어 "여러 API를 병렬로 호출하되(Cut), 전체 요청은 순서대로 처리(Queue)"하는 거지:

var requestQueue = Queue();

function processOrder(order) {
  requestQueue(function(queueDone) {
    var done = Cut(3, function() {
      finalizeOrder(order);
      queueDone();
    });

    fetchPrice(order, done);
    fetchInventory(order, done);
    fetchShipping(order, done);
  });
}

각 주문은 순서대로 처리되지만, 주문 하나를 처리할 때 가격/재고/배송 조회는 병렬로 실행돼. 큰 동시성 프레임워크를 갖다 쓰는 것보다 이렇게 작은 도구를 이해하고 조합하는 게 함수형 접근이야.


정리

17장 읽고 기억할 거 세 가지:

  1. Cut() = N개의 타임라인이 모두 끝나면 콜백 실행. 병렬 작업의 합류 지점을 만드는 동시성 기본형
  2. Cut과 Queue 같은 동시성 기본형은 작고 조합 가능하게 만든다. 큰 프레임워크보다 작은 도구의 조합이 함수형 스타일
  3. 동시성 분석에서 중요한 건 "가능한 실행 순서의 수". Cut을 쓰면 분석할 조합이 크게 줄어든다