並行処理について
人間なら誰でも並行処理を理解している。
この世界は並列だ。
Erlangのプログラミングは人間の思考と対話をモデル化している。
人間はそれぞれメッセージを送ることによって通信し合う独立した存在として動く。
誰かが死ねば、他の誰かが気づいてくれる。Joe Armstrong
プログラミングErlangより引用
1つのコンピューターで出来ることには限りがある。より高度な処理をしたいと思った時には並行処理や並列処理を行う必要がある。
並行?
並行?
なにそれ、めちゃくちゃ難しそう…と感じてしまうが、プログラミングErlangを読む限り、そう焦る必要はないらしい
実際に我々、人間が日々、暮らしているこの世界でも並行処理が行われている
たとえば、誰かと話をしている時。自分が友人に昨日の愉快な出来事を語る。その話を友人は相槌を打ちながら聞いてくれる。この何気ない日常のやりとりでさえも並行に処理が行われていることに気づく
自分が話をするという動作をするのと同時に相手は話を聞いて相槌を打つという動作を行なっている。これを創造主の視点から見てみると、あたかも二人が同時に、すなわち並行に処理をしているように見える。というか、している。つまりは、我々人間が1つのプロセスという単位で動いていると見なすことが出来る
これが人間の日常生活は並行処理に溢れているという一例だ
並行処理と並列処理の違い
以下のブログにて詳細に解説がされていた。せっかくなので、自身の言葉で並行と並列について違いをまとめておこう
yohei-a.hatenablog.jp
違いを説明するのに5人の人間に命令を出すというケースを例にしてみる。5人の人間に高速で順次、あたかも同時に見えるような速度で命令を順次出していくような処理を並行処理。5人の人間に本当に同時に命令を出すような処理を並列処理と考える
さらに砕いた例で説明をすると、1つの脳みそで順次、5人の話を同時に聞く聖徳太子と5つの脳みそで同時に5人の話を聞く宇宙人をイメージしてもらえれば分かりやすいのではないだろうか
Erlangにおける並行処理の方法
のちに解説をするがErlangでは並行処理のためにプロセスが採用されており、互いの内部状態はメッセージを送り合うことで更新する。このようなモデルをアクターモデル
と呼ぶ
また、プロセスとは別に共有メモリを使用するスレッドという処理単位を用いて並行処理を行うものもある。知っているもので例をあげればgolang
のgoroutineはスレッドを用いて処理を行う
ただ、どのようにしてアクターモデル
という思想が精査され出来上がったのかが気になったので、調べてみた
アクターモデル
すでに既出でアクターモデル
について解説している優良な記事が多いので詳しい話はそちらに任せて、ざっくりと概要と説明が出来るレベルに内容をまとめておこう
アクターモデル
において、全てのものはアクターである。これはオブジェクト思考における、全てのものはオブジェクトであるという考え方と非常に似ている。そのため、アクターモデル
は並行指向オブジェクトプログラミング
とも言われるようだ
アクター同士はメッセージを送り合う事が可能であり、逆に言えばやり取りの方法はメッセージを送り合う事のみに限定されている。なぜ互いのアクター同士でメッセージを送る事が可能なのかというと、それぞれのアクターはメールボックス
とアドレス
(言うなればメールアドレス)を持っており、自分宛に受け取ったメッセージをメールボックス
にスタックする
このメッセージを順次処理していくことになる。受け取ったメッセージをトリガーにして、様々な処理を行えばアクターモデルプログラミングが可能になる
またアクター自身は別のアクターを生成することが出来る
理論や歴史はwikipediaなどに情報が転がっているのでそちらを参照してほしい
感想
このような概念が1970年代に、近未来に起こりうるであろう、分散コンピューティング、並行処理を予測して形作られてきていたということに驚きを隠せない。そして、一度は1990年代に衰退したアクターモデル
が現代になって複雑になりすぎたデータを処理するため、再び注目されていると...。熱い...
それにしても、このプログラミングErlangが面白い。著者がErlang
の作者のJoe Armstrong
であるため、並行処理に関するテクニックや考え方が散りばめられていて、Erlang
に興味がない人が読んでも勉強になる
また読み進めたい