한도 있는 동시 fetch

한도, 순서 유지, 실패는 모두 보관. Future.wait가 원시 연산자를 갖지 않는 일입니다.

fx(ids).mapConcurrent(n, fetch) // bound + order fx(ids).mapRetry(attempts, fetch, delay: backoff) // per-element retry await fx(ids).toAsync().mapOrAccumulate((r, id) async { r.ensure(ok, () => '…'); return await fetch(id); }, concurrency: n); // every failure kept

강의

아는 id 리스트를 fetch하는 것은 이벤트 스트림이 아닙니다. 데이터는 손에 있고, 일은 I/O이며, 정책은 "동시에 최대 n개, 결과는 원래 순서"입니다. 그것이 mapConcurrent입니다 (또는 .toAsync().map(f).concurrent(n), 같은 체인을 세 단계로 쓴 것). Future.wait(ids.map(fetch))는 전부를 한 번에 쏩니다. n개씩 묶으면 각 묶음의 가장 느린 것을 기다립니다. 손으로 제대로 하면 워커 풀입니다 — 공유 커서, 미리 잡은 슬롯, 워커 Future. FxDart가 그 풀에 붙인 단어가 concurrent(n)입니다.

불안정한 호출은 요소마다 mapRetry로 재시도합니다. 터미널 전체를 감싸지 않습니다. 첫 번째만이 아니라 모든 문제를 보고해야 하는 검증은 mapOrAccumulateconcurrency: n을 준 것입니다. 각 요소는 제 스코프에서 돌아가서, 하나의 실패가 형제로 새지 않고, 실패는 입력 순서로 나옵니다.

워커 풀 일의 Dart 비교는 명료함에서 fxdart입니다. 네이티브 풀은 두 번 쓰고 나면 짧아 보이지 않습니다. 이 페이지는 그 일에, 비교 예제가 보여 주지 않는 타입 있는 에러 절반을 더한 것입니다.

데모 1 · 동시에 둘, 순서는 유지

fetch 여섯, 겹치는 것은 절대 둘을 넘지 않습니다. 가짜 호출이 진행 중인 요청을 세어서 한도가 출력에 보이게 합니다.

데모 2 · 실패는 모두 보관, 한도는 그대로

짝수 id는 실패합니다. mapOrAccumulate는 여전히 한 번에 셋, 여전히 순서대로, Left모든 짝수 id를 담습니다 — fail-fast가 아니라 fail-slow.

관련: 어느 표면 — 이것이 pull-async인 이유 · concurrent · mapConcurrent · retry / mapRetry · mapOrAccumulate · 디바운스 검색 — 시간 일 · Dart vs FxDart: 한 번에 둘