mapConcurrent

동시성 제한이 있는 매핑을 한 단계로 — toAsync().map(f).concurrent(n)을 미리 결합했습니다.

FxAsyncIterable<B> mapConcurrent<A, B>(int concurrency, FutureOr<B> Function(A a) f, Iterable<A> iterable) FxAsyncIterable<B> mapConcurrentAsync<A, B>(int concurrency, FutureOr<B> Function(A a) f, FxAsyncIterable<A> iterable) FxAsync<R> Fx<T>.mapConcurrent<R>(int concurrency, FutureOr<R> Function(T a) f) // chain (sync source) FxAsync<R> FxAsync<T>.mapConcurrent<R>(int concurrency, FutureOr<R> Function(T a) f) // chain (async source)

강의

"이 값들에 이 비동기 함수를, 한 번에 최대 n개씩, 결과는 순서대로" — 실전 코드에서 가장 흔한 비동기 파이프라인인데, 지금까지는 연산자 세 개로 말해야 했습니다. 비동기 세계로 들어가는 toAsync(), 변환하는 map(f), 평가를 제한하는 concurrent(n). mapConcurrent(n, f)는 정확히 그 합성을 체인 한 단계로 만든 것입니다.

재구현이 아니라 합성 그 자체이기 때문에 모든 보장이 그대로 이어집니다. 결과는 원본 순서로 도착하고(완료 순서를 원하면 긴 형태로 풀어서 concurrentPool을 쓰세요), 동시에 실행되는 콜백은 최대 concurrency개이며, 하류 연산자들은 계속 지연 방식으로 값을 끌어옵니다. 이미 비동기인 체인에서는 map(f).concurrent(n)을 합성해 브리지를 건너뜁니다.

Dart 고유의 추가 기능입니다. FxTS는 concurrent를 별도 단계로 파이프하며, 맵과 제한 사이에 다른 연산자를 끼워야 할 때는 그 긴 형태를 언제든 그대로 쓸 수 있습니다.

데모 1 · 제한된 팬아웃, 순서 있는 결과

데모 2 · 정확히 map + concurrent입니다

직접 해 보기

연습: 순서를 유지하면서 사용자를 한 번에 두 명씩 가져와 보세요.

관련 항목: concurrent — 바탕이 되는 제한기 · concurrentPool — 원본 순서 대신 완료 순서 · toAsync — 이 연산자가 흡수한 동기→비동기 브리지 · concurrent or parallel — I/O vs CPU