第8章. ストリームによる並列データ処理
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
私たちの世界は、圧倒的に同時並行的である。 私たちのプログラミングは、より多くの問題を解決する必要があり、そのためデータ処理もしばしば並列であることが利点となる。
第6章では、関数演算で構築されたデータ処理パイプラインとしてのストリームについて学んだ。 次は並列化だ!
この章では、並行処理と並列処理の重要性、並列Streamsをいつどのように使うか、そしていつ使わないかについて学ぶ。 これまでの2つの章でStreamsを使ったデータ処理について学んだことはすべて、Streamsを並列処理に使う場合にも当てはまる。 そのため、この章では並列Streamsの違いと複雑さに集中する。
並行処理と並列処理
並列性と並行性という用語はしばしば混同されるが、それはこの概念が密接に関連しているからである。プログラミング言語Goの共同設計者の一人であるロブ・パイクは、この用語をうまく定義している:
並行処理とは、一度に多くのことを処理することである。 並列処理とは、一度に多くのことを実行することである。 この2つの考え方は明らかに関連しているが、一方は本質的に構造に関連しており、もう一方は実行に関連している。 並行処理とは、並列処理によって実際に同時に実行できるように、物事を構造化することである。 しかし、並列処理が並行処理の目的ではない。 並行処理の目的は、優れた構造と、並列処理のような実行モードを実装する可能性である。
同時実行とは、複数のタスクが重複して実行され、利用可能なリソースを奪い合うという一般的な概念である。 1つのCPUコアがスケジューリングし、適切と思われるタスク間を切り替えることで、それらをインターリーブする。 タスク間の切り替えは比較的簡単で高速である。 この方法では、2つのタスクが文字どおり同時には実行されないが、比喩的には1つのCPUコア上で同時に実行することができる。 ジャグラーが片手(シングルCPUコア)だけで複数のボール(タスク)を使っているようなものだと考えてほしい。 彼らはいつでも1つのボールしか持てない(作業をしている)が、どのボールかは時間とともに変わる(中断して別のタスクに切り替える)。 たった2つのボールでも、ワークロードをジャグリングしなければならないのだ。
一方、並列実行とは、インターリーブされたタスクを管理することではなく、同時に実行することである。 複数のCPUコアが利用可能であれば、タスクは異なるコアで並列実行できる。 曲芸師は今、両手(複数のCPUコア)を使って2つのボールを同時に持っている(同時に作業をしている)。
スレッドスケジューリングが2つの概念でどのように異なるかをより視覚的に表現した図8-1を参照されたい。
図8-1. スレッドの同時実行と並列実行
Javaにおける並行処理と並列処理には、スレッドを使って複数のタスクを処理するという同じ目的がある。 両者の違いは、それを効率的に、簡単に、そして正しく安全に行うという課題にある。
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access