*비동기 프로그래밍(4)
1) 지연된 함수열을 병렬적으로 평가하기 - C.reduce, C.take
- 현재는 싱글스레드의 특성상 한 작업이 끝나면 다음 작업으로 넘어가는 식으로 작업한다. 하지만 한꺼번에 병렬적으로 연산하면 부하는 커지지만 훨씬 빠른 속도로 처리할 수 있다.
const C = {};
function noop() {
}
const catchNoop = ([...arr]) =>
(arr.forEach(a => a instanceof Promise ? a.catch(noop) : a), arr);
C.reduce = curry((f, acc, iter) => iter ?
reduce(f, acc, catchNoop(iter)) :
reduce(f, catchNoop(acc)));
C.take = curry((l, iter) => take(l, catchNoop(iter)));
C.takeAll = C.take(Infinity);
C.map = curry(pipe(L.map, C.takeAll));
C.filter = curry(pipe(L.filter, C.takeAll));
const delay1000 = a => new Promise(resolve => {
console.log('hi~');
setTimeout(() => resolve(a), 1000);
});
go([1, 2, 3, 4, 5, 6, 7, 8, 9],
L.map(a => delay1000(a * a)),
L.filter(a => delay1000(a % 2)),
L.map(a => delay1000(a * a)),
C.reduce(add),
log,
_ => console.timeEnd(''));
- 기존의 reduce는 배열의 하나씩 꺼내서 acc에 더해주는 식으로 연산했다면, C.reduce는 배열의 모든 값을 한꺼번에 출발시켜 병렬적으로 동시에 연산한다.