本文へ移動

並行数・容量・需要 ​

map と mapSettled の上限は次のように数えます。既定値は { concurrency: 1, capacity: concurrency, ordered: true } です。

設定上限に含むもの
concurrency予約済みの上流読み取り + 実行中のコールバック(再試行の判定・待機を含む)
capacity上記 + 出力待ちの結果

どちらも正の安全な整数で、capacity >= concurrency が必要です。上流の読み取りは同時に最大1つです。capacity を増やすと、先行する要素の完了を待つ間も、結果を保持しながら後続の処理を進められます。

上限はステージごとに独立しています。外部ソースのバッファや toArray が集める配列は対象外です。

スロットの状態推移 ​

concurrency: 2、capacity: 3、ordered: true の例です。

順序保証つき map ステージ · concurrency: 2, capacity: 3

シナリオ: A → B → C の順に読み取り、A より先に B と C が完了した場合(ordered: true のため A の完了まで下流への出力を待機)。

—空き
—空き
—空き

ステップ 1 / 8 · 下流の next() 待機中: なし

下流からの要求(next())がないため、上流の読み取りはまだ始まりません。3つのスロットはすべて空いています。

読み取り + 実行中: 0 ≤ 2 · 使用中スロット: 0 ≤ 3

出力順序 ​

入力が A → B → C、完了が B → C → A の場合:

設定出力順序出力待ちの結果
ordered: true(既定)A → B → CB と C は A の出力まで容量を使う。
ordered: falseB → C → A下流が要求すれば出力でき、容量が空く。

書き込みなどの副作用の完了順も揃えるには、concurrency: 1 または逐次実行の forEach を使います。

map は出力順の設定にかかわらず、未処理のコールバックエラーで即座に停止し、他のコールバックの signal も abort します。失敗を結果として受け取って処理を続けるには mapSettled を使います。

下流からの読み取り要求 ​

新しい上流読み取りを始めるのは、下流の next() が待機している間だけです。値を1件渡すと、次の要求まで新たな読み取りは止まります。開始済みの処理は再試行も含めて継続し、結果を予約済みの容量内に保持できます。

下流の take(n) が制限するのは出力件数であり、追加の処理が開始済みの場合があります。処理対象を n 件に制限するには take(n) を map より前に置きます。

子ストリームの並行数 ​

flatten・concat・flatMap・concatMap の concurrency は、同時に扱う子ストリーム数です。既定値は 1 です。

  • 各子ストリームは、予約から後処理(return()・finalize)の完了まで1枠を使います。
  • 各子ストリームが保持するのは、実行中の読み取り1つ、またはバッファ内の要素1件までです。
  • concat と concatMap は、先行する子ストリームが終わるまで、読み終えた後続の子の枠も保持します。これにより、順番待ちの子が無制限に増えるのを防ぎます。

使い分けはオペレータの利用ガイドを参照してください。

同期処理とイベントループ ​

同期処理が続くと、タイマーや I/O の実行を妨げる場合があります。パイプラインは自動では実行を譲りません。必要に応じて、イベントループへ処理を譲るレシピを使ってください。

MapOptions · MapContext · 再試行