リアクティブプログラミング5日目
Concurrency within a flow
和訳で「フローの並行性」
サンプルコード
Flowable.range(1, 10) .observeOn(Schedulers.computation()) .map(v -> v * v) .blockingSubscribe(System.out::println);
バックグラウンドで1~10を2乗していって、結果をメインスレッドで返す
普通
Parallel processing
並列処理
Flowable.range(1, 10) .flatMap(v -> Flowable.just(v) .subscribeOn(Schedulers.computation()) .map(w -> w * w) ) .blockingSubscribe(System.out::println);
RxJavaの並列処理は 「独立したフローを実行してその結果を単一のフローにマージする」だそうな
なるほど。
flatMapは順序を保証するものではないそうです
なので代替のものがある
concatMap
一度に1つのフローを実行するconcatMapEager
すべてのフローを一度に実行するが、出力フローは処理された順番になる
concatMapEagerはちょっと行儀悪いね
こう書いてもいいって
Flowable.range(1, 10) .parallel() .runOn(Schedulers.computation()) .map(v -> v * v) .sequential() .blockingSubscribe(System.out::println);
ちょっと待て出てきてないものが多い
parallel() = ParallelFlowable
runOn
sequential()
parallel()で並列であることを明記して
runOn()でスケジューラを設定
sequential()は最初に明記した処理順に単一のフローへマージする(図が分かりやすい)
今日はずいぶんのんびりやってしまった