Skip to content
Underbleu
GithubLinkedin

3-6. 코드를 컬렉션으로 다루기 2 - series, concurrency

Functional programming1 min read

프로그래머스에서 진행한 유인동님의 ES6로 알아보는 동시성 & 함수형 프로그래밍 강의를 들으며 정리한 내용입니다.

# find계열 함수 동시성 지원하도록 리팩토링

  • findValC()를 부모함수로 활용
  • 인자에 limit 추가
1var findC = curry((f, coll, limit) => findValC((a) => go(a, f, (bool) => (bool ? a : undefined)), coll, limit));
2
3var noneC = curry((f, coll, limit) => go(findC(f, coll, limit), isUndefined));
4
5var someC = curry((f, coll, limit) => go(noneC(f, coll, limit), not));
6
7var everyC = curry((f, coll, limit) => go(findC(negate(f), coll, limit), isUndefined));

# series(), concurrency()

map계열함수. 함수세트를 배열로 집어넣었을 때,

  • series - 각 함수를 순차적으로 수행하여, 반환값을 배열로 뽑아주는 함수
  • concurrency - 각 함수를 병렬적으로 수행하여, 반환값을 배열로 뽑아주는 함수
1// time(v): 값(v)를 반환하는데 2초가 걸리는 함수
2
3const series = map((f) => f());
4const concurrency = mapC((f) => f());
5
6go(series([(_) => Promise.resolve(100), (_) => 200, (_) => Promise.resolve(300)]), log); // [100, 200, 300] -> 6초 소요
7
8go(concurrency([(_) => Promise.resolve(100), (_) => 200, (_) => Promise.resolve(300)]), log); // [100, 200, 300] -> 2초 소요

ex) 서버통신에 유용함

  1. 전혀 다른 쿼리를 서버에 날려, 이를 병렬적으로 처리해 데이터를 받아오고 (성능 good)
  2. 데이터를 다 받아오면
  3. 받아온 데이터를 html함수로 브라우저에 그려준다
1go(
2 concurrency({
3 // -> 1
4 user: (_) => Promise.resolve(["user1", "user2"]),
5 post: (_) => Promise.resolve(["post1", "post2"]),
6 }), // -> 2 {user: [u1,u2], post: [p1,p2]}
7 html
8); // -> 3

# concurrency vs async-await

concurrency가 async-await로 코드를 짜는 것보다 우월한 이유

  1. 표현력이 훨씬 좋아진다. async-await로 짜면 행사코드가 많아짐
  2. baseMF에 다형성을 추가하면, 다양한 형태의 데이터 타입을 지원할 수 있다
1// async-await 버전
2go(
3 (async () => {
4 const [users, posts] = await Promise.all([await time(["user1", "user2"]), await time(["post1", "post2"])]);
5 return {
6 users,
7 posts,
8 };
9 })(),
10 log
11);