なっとく!並行処理プログラミング
t6o_o6t.icon
セマフォは、一定数の駐車スペースがある公共駐車場に比喩されている。
とても良い表現だと思う。
リアクターは、select()などの同期型イベントデマルチプレクサを使ってイベントの発生を待つ。また、イベントハンドラを呼び出す。 同期という言葉が、このコンポーネントに付いているという事実に注意する。
select()は同期的に動作するのだが、I/Oそのものはノンブロッキングモードで行われている。 I/Oがノンブロッキングモードだからこそ、select()は複数のI/Oイベントを並行して管理できるのである。 この事実に注意すれば、同期/非同期とブロッキング/ノンブロッキングが異なるレイヤーを指す概念ということもわかる。 次のように解釈した。
ブロッキング/ノンブロッキング
(関数やシステムコールといった、I/Oを抽象化した存在に対して)I/Oが完了するまで制御を戻さないか。戻すか。 非同期/同期
複数のタスクを並行的に実行するか、しないか。
select()などのI/Oを同期的に待つ存在と、イベントループがどのようにリンクしているのかを理解した。 イベントループをrun_forever()すると、readyなタスクは順に実行されていく。
ここでの実行とは、明示的な停止ポイントの地点まで。
最終的にreadyなタスクがなくなったとき、イベントを同期的に待つ。
これにより、イベントの発生を待っていたタスクがready状態になる。
ready状態になったタスクがどれなのかは、select()の戻り値を介して調べる
ふつうのアプリケーション実装には困らないくらいにはPromiseは使ってきたので、まあ良いかとも思うt6o_o6t.icon サンプルコードにfuture.coroutine(...)という呼び出しがあるのだが、このメソッドの実装が見当たらない...
英語で検索するとそれなりに検索結果がヒットするのだが..
検索ワードが良くない?
次のような流れだと理解した。
タスクやデータを分解する。
各タスクの通信方法を設計する。
通信などが効率的になるようタスクを凝集化させる(→ 並行性は低下)。
各ワーカーにどのようにタスクをスケジューリングするのか、などを考慮する。
実装する。
分散処理の設計に対する具体的なイメージを持つことができた。
まとめ
本書は、他の書籍に比べ、平易な言葉で、幅広いトピックが語られていると感じた。t6o_o6t.icon
また、他の「なっとく」シリーズと同様、豊富な図で視覚的に理解を進めることができる。
サンプルコードが豊富なのが個人的に良かった。t6o_o6t.icon
文章だけでは理解しがたい概念も、サンプルコードで仕組みの簡易的な実装が示されているので分かりやすい。
並行処理に関心を持った学生や、これから並行処理の実装に取り組む開発者には有用な本である。