ひよっこゲームブログ

なにもかも初心者のひよっこがゆったりと何かする

リアクティブプログラミング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()は最初に明記した処理順に単一のフローへマージする(図が分かりやすい)


今日はずいぶんのんびりやってしまった